获取新持久化实体的ID(PK)

时间:2011-06-10 08:06:21

标签: mysql servlets persistence jpa-2.0

我正在使用MySql 5.02 DataBase开发J2EE 6 Web应用程序。每次创建新实体时,我都会尝试生成ID的哈希摘要。这被设置为表格上的一列。

但是,好吧,我坚持一些显然很容易的东西,根据我发现的谷歌搜索,可能。基本上我想检索新持久化对象的ID(主键),但无论我尝试什么,它都返回null。

步骤如下:

  1. 创建实体的实例 - > userCard = new Users();
  2. 使用某些值设置相应的字段。
  3. 调用persist()。{/ li>的EntityManager方法

    在阅读了一些论坛后,我了解到我必须在flush()之后调用persist(),或者使用merge()并使用返回的实体来检索ID。

    public void createAndFlush(Users users) {
        em.persist(users);
        em.flush();
    }
    
    public Integer edit(Users users) {
        return ((Users)em.merge(users)).getIdvcards();
    }
    

    其中没有一个(在其他一些组合中)工作,实体成功保留,但ID字段返回null。

    这些是我想要检索的id列的相应注释:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idvcards")
    private Integer idvcards;
    

    显然,我的表的列idvcards设置为Auto-Increment和Primary Key。

    也许我只需要澄清我的Peristence-Management概念,但如果我能得到一些解决这个基本问题的提示,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

也许不是最优雅的解决方案,但最后我成功检索了新实体的ID:

public Integer create(User user) {
    em.persist(users);
    em.flush();
    return (Integer) em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(users);
}

而且,虽然与功能无关,但我将实体名称更改为@Bohemian建议的单数形式。

答案 1 :(得分:1)

试试这个,它对我有用:

@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)

另外,我不使用merge返回的值。我只是persist然后flush,实体对象会神奇地获取新的键值。

P.S。表永远不应以复数形式命名,尤其不应以实体类命名。调用类User(如果可以的话,调用表)。否则它只是令人困惑:Users听起来像是User的集合。

答案 2 :(得分:0)

它会正常工作

em.persist(usmApproveTransaction);
em.flush();

System.out.println("++++++e++++++++"+usmApproveTransaction.getUatApproveTransIdPk());
return usmApproveTransaction;

我在em.flush();

之后使用persist获取了ID
  

++++++Ë++++++++ 51472