2011-10-07 36 views
0

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

//表结构

@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 
} 

回答

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; 
    //.... 
} 
+0

谢谢你我会尽量使用相同的。 – Greg

+0

我尝试使用Idclass注释,但我仍然得到相同的唯一的constaint错误,我相信有一个问题,我如何坚持对象列表。 – Greg

+0

您是否使用过'@ Embeddable'和'@ EmbeddedId'注解? –