【发布时间】:2018-02-16 08:51:58
【问题描述】:
如果我有两个休眠实体,例如:
@Entity
class Company {
@Id
Integer id;
String name;
}
@Entity
class Person {
Integer id;
String name;
@ManyToOne
Company company;
}
我有一个已经存储的公司,例如Company(id:1, name:"Acme")
我可以创建一个仅使用 id 引用公司的人,而不是加载整个记录,例如:
Session session = SessionFactory.openSession();
Company acme = new Company();
acme.setId(1);
Person person = new Person();
person.setName("Manuel");
person.setCompany(acme);
session.save(person);
它是只保存参考,还是用name=null更新公司?
【问题讨论】:
-
为什么不从数据库中检索实际的
Company并将其添加到User? -
您正在创建一个与现有公司对象具有相同 PK 的新公司对象。如果
id列被定义为具有数据库中相关约束的PK 列,Hibernate 将尝试插入它,并且数据库将在其表面抛出错误。您需要从数据库中通过PK读取公司并添加。 -
@LordAnomander 我正在使用遗留代码,我遇到了“状态”对象的这种情况,比如一个请求是(草图、发送、批准、bla、bla),每个状态都是实体,所以每次你必须将状态更改为像
ObjectState state = stateDao.findById(Constants.OBJECT_STATE_APPROVED)这样的行时,我想删除这行,因为它们很多,只需在代码库中添加熵!我很难创建一个虚假的枚举,其中所有状态都是仅使用 PK 进行评估的对象。 -
@JohannesJander 这取决于映射(精确级联)。对于此映射,您不正确。