2011-06-10 70 views
1

我正在使用MySql 5.02数据库开发J2EE 6 Web应用程序。我试图生成一个ID的哈希摘要,每次我创建一个新的实体。这被设置为表格中的一列。获取新持久实体的ID(PK)

但是,我被困在显然很容易的东西上,并且根据我发现的搜索结果,可能。基本上我想检索新持久对象的ID(主键),但无论我尝试什么,它都会返回null。

的步骤如下是:

  1. 创建实体的实例 - >userCard = new Users();
  2. 设置一些值对应的字段。
  3. 调用EntityManagerpersist()方法。

阅读一些论坛上后,我明白我必须persist()后,无论是打电话flush(),或使用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列的correspinding注释:

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

而且很明显,我的表的列idvcards设置为自动递增和主键。

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

回答

2

也许不是有史以来最完美的解决方案,但最后我succeded上检索新实体的ID:

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

很好,althought是不相关的功能,我改变了实体名称作为@Bohemian提出的单数形式。

+0

我赞成你张贴结果和友好评论:) – Bohemian 2011-06-10 10:28:21

+0

也为我工作,谢谢。 – Puckl 2013-04-09 22:17:02

1

试试这个,它为我工作:

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

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

p.s.表格不应该以复数形式命名,尤其不能以实体类别命名。致电User(如果可以的话)表格。否则,它只是令人困惑:Users听起来像一个User的集合。

+0

感谢提示和建议(我同意实体应该以单数形式命名),但不幸的是没有'strategy'属性,persist()'抛出一个'DatabaseExcept ion'。它似乎试图找到一个名为“序列”的表,我认为这将是定义序列所必需的,因为我没有声明“GenerationType”。 – mdelolmo 2011-06-10 09:08:48

0

它会正常工作

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

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

我收到后使用em.flush(); ID persist

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