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.