【问题标题】:JPA/Hibernate: Settings multiple values in one setterJPA/Hibernate:在一个设置器中设置多个值
【发布时间】:2014-03-27 07:44:49
【问题描述】:

我有一个实体,其中一个字段 B 可能依赖于字段 A(仅适用于某些情况)。为了确保它们都在需要时更新(以避免使用实体的其他人忘记依赖关系)我尝试了这样的事情:

public void setA(A a) {
    this.a = a;

    if (condition) {
        this.b = someCalculation(a);
        // setB(someCalculation(a)); Doesn't work either!
    }
}

代码被执行并且B的值被正确填充。但是,B 没有持久化。

这样的事情是不可能的吗?为什么hibernate不知道B的变化?

提前致谢,

亚历克斯

【问题讨论】:

  • 您确定对象在所有更改后仍然存在吗?你能显示更多代码吗?顺便说一下这段代码有异味,我建议把这个逻辑从 setter 移到一些单独的方法/类
  • 是的,因为字段 A 已正确持久化。

标签: java hibernate jakarta-ee jpa


【解决方案1】:

您应该使用不直接访问该字段的设置器。考虑到 Hibernate/JPA 实体是代理的,所以当它们改变时会执行某些操作(使用方法)。

您可能还需要查看主实体和“b”实体之间的关系,因此在设置新的“b”实体时为automatically persisted (cascade operations)

【讨论】:

  • 我首先使用了setter setB()(见上面的代码)。它也不起作用。无论如何 B 使用字段访问。
  • B 是同一实体中的一个字段。
  • B 实际上是 Date 类型
  • 如果 B 是简单类型(例如 Date)并且您使用的是 setter,那么我唯一想到的是您实际上并未使用托管实体。您确定您的域实体是托管实体吗?你如何获得它?你从实体经理那里得到参考吗?您可以调试您的代码并验证您的主要实体实际上是一个代理(您应该看到代理字段)
猜你喜欢
  • 2011-06-25
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 2014-04-10
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多