java - Hibernate JPA Annotations 1 到 0..1 的关系

原文 标签 java hibernate jpa

我正在尝试建立 1to0..1(零或一)关系,但遇到了问题。

现在我的假设是使用@OneToMany,而不是@OneToOne。

基本上我希望我的“子”表保存“父”的外键(我非常松散地使用子和父)。我永远不需要独立加载“ child ”

这是我要实现的基本表结构

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 中注册的 Invoice 或 Catalog 将创建我想要的表,并且可以完美地工作。但是,一旦我注册了发票和目录, 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 Annotations 1 到 0..1 的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7913963/

相关文章:

java - 如何使用 JMX 获得 Tomcat 上传/下载速度

java - 在Gradle中将DBDeploy与hibernate一起用作ORM

java - 使用 Hibernate 计算和存储预先计算的平均值

hibernate - JPA, hibernate : Persist through multiple levels

java - 打印在Java中产生错误的输出

java - 为什么我不能在参数中使用通配符类型来计算

java - 许多嵌入式属性引用相同的Embeddable类

java - 如何优化循环中的 hibernate 方法调用?

java - 你将如何处理 future 可能不同的两个相同的值对象?

java - 如何在你的库中使用 Spring-Data 以及如何在你的项目中使用这个库?