【问题标题】:JPA persist list of objects of table with Composite primary keyJPA持久化具有复合主键的表对象列表
【发布时间】:2011-10-07 14:50:04
【问题描述】:

我需要用复合主键保存一个表的对象列表,我这样做如下所示。但是我收到一个错误原因: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
}

【问题讨论】:

    标签: hibernate jpa


    【解决方案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;
         //....
    }
    

    【讨论】:

    • 谢谢你,我会尝试使用相同的。
    • 我尝试使用 Idclass 注释,但我仍然得到相同的唯一约束错误,我认为我持久化对象列表的方式存在问题。
    • 你试过@Embeddable@EmbeddedId注解吗?
    • 您是否已将 PK 类 CompPrimaryObjId 添加到映射类中?您是否尝试过 @Embeddable 和 @EmbeddedId 注释?
    【解决方案2】:

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

    Mapping ManyToMany with composite Primary key and Annotation:

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2020-09-17
      • 1970-01-01
      相关资源
      最近更新 更多