Hibernate @具有复合密钥的一对多关系
我有以下模型(忽略不相关/明显的代码,如setter和getter):Hibernate @具有复合密钥的一对多关系,hibernate,jpa,composite-key,Hibernate,Jpa,Composite Key,我有以下模型(忽略不相关/明显的代码,如setter和getter): @实体 公共类发票{ @Id//生成的序列 私人长发票ID; @OneToMany(fetch=FetchType.EAGER) @JoinColumn(name=“invoiceId”,referencedColumnName=“invoiceId”) @订购人(“id.itemNumber”) 列表项=新建ArrayList(); } @实体 公共类项目{ @嵌入ID 私有项pkid; } @可嵌入 公共类ItemPK{
@实体
公共类发票{
@Id//生成的序列
私人长发票ID;
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name=“invoiceId”,referencedColumnName=“invoiceId”)
@订购人(“id.itemNumber”)
列表项=新建ArrayList();
}
@实体
公共类项目{
@嵌入ID
私有项pkid;
}
@可嵌入
公共类ItemPK{
私人长发票ID;
专用长项目编号;
}
无法更改数据库结构,因为它是旧数据库:(
itemNumber基本上是一个从零开始的索引
如果我使用现有发票,只删除现有项目并在列表中添加2个新项目,那么在尝试更新发票对象时,我会遇到各种问题:
如果我将ItemPK保留为空,我会得到:
org.hibernate.transientObject异常:对象是未保存的临时实例-合并前保存临时实例
如果我尝试自己填充ItemPK的值(发票的id和索引),我会得到:org.hibernate.ununiqueObjectException:具有相同标识符值的不同对象已与会话关联(数据库中已经有一个发票项,它的发票id和索引为0,就像我的新项目列表中的第一个对象一样)
如果我尝试将invoiceId保留为null(在ItemPK对象中),我会得到:java.sql.BatchUpdateException:ORA-01400:无法将null插入(“项”。“invoiceId”)
有没有办法让Hibernate/JPA来处理这个问题?
或者我需要完全删除关联,将列表定义为@Transient,然后将其填充并保存在我的服务类中吗
谢谢。由于项目实体中的invoiceId实际上是发票的外键,因此这里实际上有一个双向关联。因此,您应该将关联映射为双向关联,并使用注释。其javadoc有一个示例。我有一个类似的问题,尝试使用它,但无法使其工作:
@Entity
public class Invoice {
@Id // sequence generated
private Long invoiceId;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "invoiceId", referencedColumnName = "invoiceId")
@OrderBy("id.itemNumber")
List<Item> items = new ArrayList<Item>();
}
@Entity
public class Item {
@EmbeddedId
private ItemPK id;
}
@Embeddable
public class ItemPK {
private Long invoiceId;
private Long itemNumber;
}