0

我将 JPA 2.0 与 eclipselink 与 postgres DB 一起使用。

我想坚持新的实体类。主键是一个整数,没有空约束。

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

如何获取新的主键值?

我无法更改 DB sheme。

我考虑获取最大 ID 并向数据库中插入一个更大的 ID,但这是一种混乱的解决方案。

这是实体类中主键的定义,用netBeans 7.0.1生成: @Id @Basic(optional = 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 
     }

}

4

1 回答 1

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

于 2012-07-24T13:51:03.223 回答