我正在尝试设置 1to0..1(零或一)关系,但遇到了问题。
现在我的假设是使用@OneToMany,而不是@OneToOne。
基本上我希望我的“子”表保存“父”的外键(我非常宽松地使用子和父)。我从来不需要独立加载“children”
这是我想要实现的基本表结构
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 中注册了发票或目录,上面的代码将根据我的需要创建表,并且可以完美工作。但是,一旦我注册了发票和目录,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;
}
关于java - Hibernate JPA 注解 1 到 0..1 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7913963/