我正在尝试建立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映射此架构(至少,只要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;
}

09-10 08:03
查看更多