我正在尝试建立1to0..1(零或一个)关系,但是遇到了问题。
现在,我的假设是使用@OneToMany,而不是@OneToOne。
基本上,我希望我的“子代”表将外键保存到“父代”(我非常宽松地使用子代和父代)。我永远不需要单独加载“儿童”
这是我要实现的基本表结构
ITEM {
ID
RELATED_ITEM_ID
}
INVOICE {
ID
}
CATALOGUE {
ID
}
表示为Java类,如下所示
class Item {
...
}
class Invoice {
@OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
@Fetch(FetchMode.JOIN)
@JoinColumn(name="RELATED_ITEM_ID", nullable=false)
Set<Item> items;
}
class Catalogue {
@OneToMany(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
@Fetch(FetchMode.JOIN)
@JoinColumn(name="RELATED_ITEM_ID", nullable=false)
Set<Item> items;
}
上面的代码(如果我仅在hibernate中注册了发票或目录)将根据需要创建表,并且可以正常工作。但是,一旦我同时注册了发票和目录,休眠就会向我抛出错误
org.hibernate.MappingException: Duplicate property mapping of _itemsBackref found in package.name.Item
最佳答案
我认为无法使用Hibernate映射此架构(至少,只要Customer
和Recepient
不扩展同一实体)。
相反,使用以下架构会容易得多:
ADDRESSES {
ID
}
CUSTOMER {
ID
ADDRESS_ID
}
RECIPIENT {
ID
ADDRESS_ID
}
class Customer {
@OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
@Fetch(FetchMode.JOIN)
@JoinColumn(name="ADDRESS_ID")
Address address;
}
class Recipient {
@OneToOne(fetch=FetchType.EAGER, orphanRemoval = true, cascade = { javax.persistence.CascadeType.ALL })
@Fetch(FetchMode.JOIN)
@JoinColumn(name="ADDRESS_ID")
Address address;
}