Hibernate @具有复合密钥的一对多关系

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{

我有以下模型(忽略不相关/明显的代码,如setter和getter):

@实体
公共类发票{
@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;
}