我使用带有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
}
}
答案 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