【问题标题】:JPA / Hibernate / MS SQL Server not returning generated id valueJPA / Hibernate / MS SQL Server 不返回生成的 id 值
【发布时间】:2010-08-17 15:21:24
【问题描述】:

我正在使用带有 MS SQL Server 2005 的 Hibernate 实体管理器 3.5.1-Final,并尝试保留多个新实体。我的实体是这样注释配置的:

@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]

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

【问题讨论】:

    标签: sql-server-2005 hibernate orm jpa identity


    【解决方案1】:

    我遇到了类似的问题,我已对其进行了故障排除,这对我有用:

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

    refresh() 方法成功了。

    注意:在我的回答中,我假设您的数据库表已正确设置,其身份规范设置为相关列的“是”。

    【讨论】:

      【解决方案2】:

      我没有看到生成的Id集,它保持为0。

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

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

      我可以通过在持久化下一个实体之前从缓存中逐出最近持久化的实体来解决这个问题,但这并不理想。

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

      【讨论】:

      • 我发现了问题 - 这是一个遗留表,我没有意识到表上有一个 INSTEAD OF INSERT 触发器,它破坏了传递回 Hibernate 的 @@IDENTITY 值。跨度>
      【解决方案3】:

      使用大写的“I”整数。

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

      【讨论】:

      • 似乎没有什么不同。每次插入后也不冲洗。
      • 那么如果只持久化一个对象,它真的会出现在数据库中吗?如果是这样,您是否覆盖了 equals 和 hashcode 方法,它们是否可能返回错误的值?您是否尝试在 getId() 而不是字段上设置注释?您是否定义了 getter 和 setter?请向我们提供更多详细信息。
      • 另外,您在创建表时是否在 id 上使用了“auto_increment”?创建 TABLE XXX(id int NOT NULL AUTO_INCREMENT 等)
      • 我发现了问题 - 这是一个遗留表,我没有意识到表上有一个 INSTEAD OF INSERT 触发器,它破坏了传递回 Hibernate 的 @@IDENTITY 值。跨度>
      猜你喜欢
      • 2023-02-18
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2013-03-18
      • 2021-01-10
      相关资源
      最近更新 更多