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

标签 java hibernate jpa

我正在尝试设置 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/

相关文章:

java - JPA 实体的 DTO 生成器

java - 如何反转这个从第 n 个元素到最后的链表

java - 在 if else 语句中定义具有可选类类型的变量

java - JPA OneToMany 列表找不到应该继承的 mappedBy 属性

java - Quarkus、PanacheEntity 和保存列表或集

java - 在 jpql 查询中创建和填充 pojos 并作为列表获取

java - 从 Java 执行命令时出现问题

java - 每个 Namedcache 的 Coherence 分布式缓存过期

java.lang.NoClassDefFoundError : Could not initialize class org. hibernate .ejb.Ejb3Configuration

java - Spring Boot集成测试中如何获取JPA上下文?