【问题标题】:Hibernate: How to update on different IDHibernate:如何更新不同的 ID
【发布时间】:2012-12-08 17:19:23
【问题描述】:

问题:我如何在 Hibernate 中指出 [ref] 是真正的主键,但是在更新记录时我希望它在 [objectID] 上应用 .update 或 .saveOrUpdate。

上下文: 我有一个场景,我正在将信息从 web 服务同步到表中。在导入对象时,我会保留对象的唯一引用,这使我能够再次运行脚本并更新本地保存的对象信息。

示例:由三个字段组成的简单表格。

[ref] [objectID] [objectTitle]


[ref] = 主键。新记录插入的增量。用于内部查找和关系关联。

[objectID] = 对象本身的唯一标识符。

[objectTitle] = 与 objectID 相关的信息。这可能会在更新时发生变化。


我对如何在 Hibernate 中进行设置有点困惑。似乎我 必须 将 [ref] 设置为 @Id,因此它将使用生成器自动递增。问题是我希望使用 [objectID] 更新信息,而不是 [ref]。

【问题讨论】:

    标签: hibernate entity


    【解决方案1】:

    嗯,很简单。

    首先加载具有给定 objectID 的实体:

    MyEntity m = 
        (MyEntity) session.createQuery("select m from MyEntity m where m.objectID = :objectID")
                          .setParameter("objectID", theObjectID)
                          .uniqueResult();
    

    然后您使用从 Web 服务获得的新标题更新此实体:

    m.setObjectTitle(theObjectTitle);
    

    【讨论】:

    • 有更有效的方法吗?如果您要同步 5,000 多条记录,那么对每条记录来说都是相当大的开销。有没有一种方法可以在更新时指示使用哪个字段作为参考键?
    • 是的,有。使用更新查询。但这导致代码看起来更像 JDBC 代码而不是 Hibernate 代码,可能不会更有效率(在某些情况下甚至可能效率更低),并且更具限制性。见docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/…
    • 如果您需要一次修改多个实体,您当然也可以使用where m.objectId in :listOfObjectIds 子句一次加载多个实体。
    【解决方案2】:

    这是否可以更新表中的“id”列? .hbm 文件中的“id”是这样的:

    <id name="id" type="int" column="id">
    <generator class="increment"/>
    </id>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-24
      • 2022-06-11
      • 2023-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多