【问题标题】:Jpa 2.0 eclipselink how to persist(insert) entity class, without auto generated primary keyJpa 2.0 eclipselink 如何持久化(插入)实体类,没有自动生成的主键
【发布时间】:2012-07-22 16:11:51
【问题描述】:

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

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

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

如何获取新的主键值?

我无法更改 DB sheme。

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

这是实体类中主键的定义,用netBeans 7.0.1生成: @ID @基本(可选=假) @Column(name = "obj_id") 私有整数 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 
     }

}

【问题讨论】:

    标签: jpa-2.0 eclipselink postgresql-9.1


    【解决方案1】:

    如果这是一个现有的应用程序,它如何分配主键?
    您当然可以在调用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多