Ensar Basri Kahveci

overly distributed

Hibernate "A component cannot hold properties split into 2 different tables" hatası

Posted at — Sep 22, 2011

Bugün Hibernate’den çok güzel bir Exception yedim. Başta Exception biraz ilginç geldi ama, sebebini anlayınca Hibernate’e acayip hak verdim. @Embeddable ile annotate ettiğim bir sınıfı başka bir entity sınıfının içinde @Embedded ile tanımladığımda, Hibernate ayağa kalkarken şu hatayı attı:

org.hibernate.AnnotationException: A component cannot hold properties split into 2 different tables

@Embeddable dediğim sınıfın içeriği şuna benzer bişeydi:

@Embeddable
public class Details {
	// ...	
	// fields
	// ...

	@ManyToOne
	@JoinTable(...)
	private Category category;

	// getters & setters
}

Hatanın sebebi, @JoinTable annotation’ı. @JoinTableı kullandığımızda, @Embeddable sınıf, embed edilebilirliğini kaybediyor. @Embeddable için javadoc’ta “Defines a class whose instances are stored as an intrinsic part of an owning entity and share the identity of the entity. Each of the persistent properties or fields of the embedded object is mapped to the database table for the entity….” diyor. JoinTableı kullandığımızda ise, entity’ler arasındaki ilişki, ayrı bir tabloda kurulduğundan, category field’i embed eden sınıfın tablosuna eklenemiyor.

Çözüm @JoinTable yerine ilişkiyi @JoinColumn ile kurmak. @JoinTable yerine @JoinColumn kullandığımızda, embed eden entity’yi category’ye bağlayacak foreign key, entity’nin tablosuna ekleneceğinden, hata durumu oluşmuyor.

comments powered by Disqus