2010-07-15 96 views
3

伪代码来切入正题:休眠 - 保存实体 - 更新表 - 不是基于主键

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

使用案例库,或服务:

personRepository.save(new Person(ssn:"123456", name:"jeff")): 
  • ID是独特和自动增量主键
  • SSN是唯一的,是一个人的标识
  • 名称只是一个字符串,可以改变

目前保存使用Hibernate的merge()做插入/更新,但我没有id当我救了我的抽象层(部分,以便客户端代码并不需要接触实体),所以如果SSN已经存在于数据库中而不必对该字段进行单独查找,然后在那里分支逻辑,我如何才能更新人员名称(我不想这样做,因为我可能会一次更新并插入许多人,并认为它会很慢)

+0

我应该只删除所有,然后重新插入? – walnutmon 2010-07-15 18:47:59

回答

1

我怎么可以更新者名称如果SSN是在数据库中已经存在,而不必做该领域的一个单独的查询,然后分支逻辑在那里(...)

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

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字段来帮助确定持久状态。

+0

有什么办法可以使这个实体的默认更新?因为我不会一直手动调用更新,所以可能会从父对象级联。如果不是,这可能是我可以做的最好的,但是我可能会重新评估我的实体,并想出不同的东西 – walnutmon 2010-07-16 12:55:09

+0

如果对象与持久上下文中的父对象正确关联,并且您已经在父对象给孩子,Hibernate应该自动为你处理这个问题,根据你的孩子对象的需要更新/创建适当的改变,说你使用父对象的saveOrUpdate。 – apiri 2010-07-16 13:47:49