gpt4 book ai didi

java - Hibernate JPA 注解 1 到 0..1 关系

转载 作者:行者123 更新时间:2023-12-01 05:37:35 26 4
gpt4 key购买 nike

我正在尝试设置 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 映射此架构(至少,只要 CustomerRecepient 不扩展同一实体)。

使用以下架构会更容易:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com