【问题标题】:Hibernate - Saving Entities - Update Table - Not based on Primary Key休眠 - 保存实体 - 更新表 - 不基于主键
【发布时间】:2011-03-16 13:54:46
【问题描述】:

进入正题的伪代码:

@Entity
Person {
   @Id
   Integer id;
   String SSN;
   String name;
}

存储库或服务的用例:

personRepository.save(new Person(ssn:"123456", name:"jeff")):
  • id 是唯一且自动递增的主键
  • SSN 是唯一的,是一个人的标识符
  • name 只是一个字符串,可以更改

目前保存使用休眠的merge() 进行插入/更新,但我在保存时没有id(我的抽象层的一部分,因此客户端代码不需要在全部),那么如果 SSN 已经存在于数据库中,我该如何更新人员姓名,而无需对该字段进行单独查找,然后在其中进行分支逻辑(我不想这样做,因为我可能是一次更新和插入很多人并认为它会很慢)

【问题讨论】:

  • 我应该全部删除然后重新插入吗?

标签: java hibernate orm persistence


【解决方案1】:

您可以使用会话来生成 HQL 查询,并按照以下方式滚动您自己的更新:

String queryString = "update Person set name = :name where ssn = :ssn";
Query query = session.createQuery(queryString);
query.setString("name", newName);
query.setString("ssn", ssn);
query.executeUpdate();

我不知道按照您的建议更新实体的方法,因为 Hibernate 非常依赖您的 @Id 字段来帮助确定持久状态。

【讨论】:

  • 有没有办法让它成为实体的默认更新?因为我不会总是手动调用更新,它可以从父对象级联。如果没有,这可能是我能做的最好的,但是我可能会重新评估我的实体并想出一些不同的东西
  • 如果对象与持久上下文中的父对象正确关联,并且您在父对象上建立了级联到子对象,Hibernate 应该自动为您处理,更新/创建适当的更改您的子对象在必要时说您使用父对象的 saveOrUpdate。
【解决方案2】:

如果 SSN 已经存在于数据库中,我如何更新人员姓名,而无需对该字段进行单独查找,然后在其中进行分支逻辑 (...)

我能想到的唯一选择是使用 SSN 作为主键。

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 2012-09-09
    • 2016-12-27
    • 2020-02-16
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多