【问题标题】:Saving a foreign key using entity with only id valorized使用只有 id valorized 的实体保存外键
【发布时间】: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 这取决于映射(精确级联)。对于此映射,您不正确。

标签: java hibernate jpa


【解决方案1】:

是的,你可以做到。

它是只保存参考,还是更新公司 名称=null?

使用默认的cascade,这样,Hibernate 将什么也不做。所以答案是:它只保存一个外键。

最有效的(对于 JPA 也是)方法是使用 session.load(Company.class, 1)。它返回一个代理而不对数据库做任何请求。但是,当然,您需要为此进行会话。

【讨论】:

  • 我有这种“状态”对象的情况,就像一个请求是(草图,发送,批准,bla,bla)并且每个状态都是一个实体,所以每次你必须改变状态到你有像ObjectState state = stateDao.findById(Constants.OBJECT_STATE_APPROVED) 这样的行的东西。我想手动创建一个枚举,其中所有这些状态实体都仅使用它们的 id 进行评估(现在我有相同的但使用它们的 id),但我不确定它是否可以工作。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 2011-05-01
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多