Jpa 2.0 eclipselink如何持久化(插入)实体类,无需自动生成主键

时间:2012-07-24 10:47:55

标签: jpa-2.0 eclipselink postgresql-9.1

我使用带有postgres DB的eclipselink使用JPA 2.0。

我想要预先确定新的实体类。主键是Integer,非空约束。

当我要插入时,JPA不知道新主键的值。

如何获取新的主键值?

我无法更改DB sheme。

我认为获取最大ID并在数据库中插入更大的ID,但它有点混乱。

这是使用netBeans 7.0.1生成的实体类中主键的定义:         @ID         @Basic(可选= false)         @Column(name =“obj_id”)         private Integer ObjId;

    public void save(){
    TkTopoVerzio test= new TkTest();
    // set all the value
    // ....

    try {
            em.getTransaction().begin();
            em.persist(test);
            em.getTransaction().commit();  

     } catch(javax.persistence.NoResultException ex){
        //Todo : manage exception
     } catch (Exception ex){
         // toDO : manage exception 
     }

}

1 个答案:

答案 0 :(得分:0)

如果这是现有应用,它如何分配主键?
您当然可以在调用persist之前直接在新对象中分配pk,但EclipseLink也允许自定义pk生成器: http://wiki.eclipse.org/EclipseLink/Examples/JPA/CustomSequencing 这将允许您使用您需要的策略分配pk。

您所建议的问题(使用max查找现有值)的问题在于,这非常难以成为线程甚至是多应用程序安全的。高度并发或分布式应用程序可能会遇到pk重用问题。如果您不能使用面向数据库的pk生成策略,UUID可能是更好的方法。这里有一个很好的资源: http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing