休眠 - 保存实体 - 更新表 - 不基于主键

时间:2010-07-15 18:30:15

标签: java hibernate orm persistence

伪代码达到目的:

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

存储库或服务的用例:

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

目前save使用hibernate的merge()来进行插入/更新,但是当我保存时我没有id(我的抽象层的一部分,因此客户端代码不需要完全触摸实体),那么如果SSN已经存在于数据库中而不必对该字段进行单独查找,然后在那里分支逻辑(我不想这样做),如何更新人名?因为我可能会立即更新和插入许多人,并认为它会很慢)

2 个答案:

答案 0 :(得分:2)

您可以使用会话生成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字段来帮助确定持久状态。

答案 1 :(得分:1)

  

如果SSN已经存在于数据库中而不必在该字段上单独查找,然后在那里分支逻辑(...)

,我该如何更新人名

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