JPA持久化具有Composite主键的表的对象列表

时间:2011-10-07 14:50:05

标签: hibernate jpa

我需要使用复合主键保存表的对象列表,我正在执行如下所示的操作。但我得到一个错误引起:java.sql.BatchUpdateException:ORA-00001:违反了唯一约束。         但是列表中的项目是唯一的,我做错了什么。

//表格结构

@Entity
   @Table(name="COMP_PRIMARY")
   CompPrimaryObj{
   @Id
   @Column(name="KEY1")
   private String key1;

   @Id
  @Column(name="KEY2")
  private Long key2;
   }

//我的服务层中的代码

List<CompPrimaryObj> compPrimaryObjList = new ArrayList<CompPrimaryObj>();
CompPrimaryObj obj1 = new CompPrimaryObj();
obj1.setKey1("key1");
obj1.setKey2(11111);
compPrimaryObjList.add(obj1);
CompPrimaryObj obj2 = new CompPrimaryObj();
obj2.setKey1("key2");
obj2.setKey2(222222);
compPrimaryObjList.add(obj2);
for(CompPrimaryObj compPrimaryObj:compPrimaryObjList){
   em.persist(compPrimaryObj);  // em stands for Entity manger instance
}

2 个答案:

答案 0 :(得分:1)

处理复合主键时,您有两个选择。在每个中,你必须创建一个新类来保存代表PK的字段:

复合主键:

@Entity 
@Table(name="COMP_PRIMARY")
@IdClass(CompPrimaryObjId.class)
public class CompPrimaryObj {
    @Id 
    @Column(name="KEY1")
    String key1;
    @Id 
    @Column(name="KEY2")
    Long key2;
    //...
}
public class CompPrimaryObjId{
    String key1;
    Long key2;
}

或使用嵌入式主键:

@Embeddable
public class CompPrimaryObjId {       
    @Column(name="KEY1")
    private String key1;
    @Column(name="KEY2")
    private Long key2;
    // ...
   }
}

@Entity
@Table(name="COMP_PRIMARY")
public class CompPrimaryObj {
     @EmbeddedId
     private CompPrimaryObjId id;
     //....
}

答案 1 :(得分:0)

最近我使用Composite主键映射了@Many-To-Many。看看这篇文章,我认为它可以为您提供所有必需的信息。

Mapping ManyToMany with composite Primary key and Annotation: