JPA/Hibernate/MS SQL Server不返回生成的id值

问题描述:

我正在使用Hibernate实体管理器3.5.1-Final与MS SQL Server 2005并试图坚持多个新实体。我的实体annotationally这样构成的:JPA/Hibernate/MS SQL Server不返回生成的id值

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int id; 

调用

entityManager.persist(newEntity) 

我没有看到generatedId集后,它仍然为0。坚持下一个新的实体时,这将导致以下异常:

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [x.y.z.MyEntity#0] 

在我坚持下一个实体之前,我可以通过从缓存中驱逐最近持久化的实体来解决这个问题,但这并不理想。插入后,我需要做什么才能正确更新对象?

我没有看到generatedId集,它仍然为0。

的注释代码本身看起来是正确的(你可以使用IDENTITYlongshortinteger类型 - 以及它们各自的包装类型 - 和String)。现在,问题是:

  • 你真的使用数据库端的标识列(请显示你的表定义)?
  • 什么SQL语句实际上执行(激活SQL日志记录)?
  • 如果您在SQL客户端中执行生成的SQL,会发生什么情况?

我可以避开这个问题从缓存中驱逐最近坚持实体之前,我坚持下一个实体,但这并不理想。

这显然不是一个解决方案。生成的ID应该分配给持久化实体,并且任何其他行为都是意外的。在某个需要修复的地方肯定存在不匹配问题。请提供所需的信息。

+0

我发现问题 - 这是一个遗留表,我没有意识到在表上有一个INSTEAD OF INSERT触发器,它将传回给Hibernate的@@ IDENTITY值搞砸了。 – timbotoolman 2010-08-18 09:33:52

使用大写的“I”整数。

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Integer id; 
+0

似乎没有区别。每次插入后都不会冲洗。 – timbotoolman 2010-08-17 15:48:49

+0

那么,如果你坚持只有一个对象,它实际上是否出现在数据库中?如果是这样,你是否重写了equals和hashcode方法,他们是否可能返回错误的值?你有没有尝试在getId()而不是字段上设置注释?你有没有定义getter和setter?请提供更多详细信息。 – 2010-08-17 21:53:57

+0

另外,当您创建表时,您是否在ID上使用“auto_increment”?创建TABLE XXX('id' int NOT NULL AUTO_INCREMENT等) – 2010-08-17 21:59:12

我有我troubleshooted了类似的问题,这个工作对我来说:

em.persist({ENTITY_TO_PERSIST}); 
em.flush(); 
em.refresh({ENTITY_TO_PERSIST}); 

刷新()方法奏效了。

注意:在我的回答中,我假设您的数据库表已正确设置,其标识规范设置为'yes'。