我正在使用MySql 5.02 DataBase开发J2EE 6 Web应用程序。每次创建新实体时,我都会尝试生成ID的哈希摘要。这被设置为表格上的一列。
但是,好吧,我坚持一些显然很容易的东西,根据我发现的谷歌搜索,可能。基本上我想检索新持久化对象的ID(主键),但无论我尝试什么,它都返回null。
步骤如下:
userCard = new Users();
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概念,但如果我能得到一些解决这个基本问题的提示,我将不胜感激。
答案 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