<-- home

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

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 notlandırdığım 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 {
	// ...	
	// primitif alanlar
	// ...

	@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 alanı 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.