【问题标题】:Transient fields are not null after loading加载后瞬态字段不为空
【发布时间】:2019-02-25 16:27:06
【问题描述】:

我对 eclipselink 2.5.2 令人惊讶的行为感到困惑。在相同的情况下,实体的瞬态字段在加载对象后设置为最后一个值。从我的角度来看,没有定义加载后瞬态字段的状态应该如何(参见https://download.oracle.com/otn-pub/jcp/persistence-2.0-fr-oth-JSpec/persistence-2_0-final-spec.pdf?AuthParam=1551111289_d4f5a797aa325dac1adb64fb8b75c2af)。谁能解释这些行为? 我阻止了这种行为并将@PostLoad 注释方法中的所有@Transient 字段设置为null。

@Entity
@Cacheable(true)
@Cache(expiry = 300000)
@Table(uniqueConstraints=@UniqueConstraint(name = "uc_b_a_v", columnNames = {"a_id", "v"}))
public class Entity {

    @Transient
    private String transientfield;  

    @PostLoad
    public void onPostLoad() {
        transientfield = null;
    }
}

【问题讨论】:

标签: java jpa eclipselink


【解决方案1】:

eclipselink 论坛上的这篇文章很好地解释了这种行为:https://www.eclipse.org/forums/index.php/t/206082/

EclipseLink 默认启用共享缓存。这个共享缓存可以 要么支持维护瞬态变量,要么不支持。

如果使用编织,共享缓存对象会被克隆到/从持久化上下文中克隆,从而保留瞬态变量的状态。

如果不使用编织,则在 持久性上下文,并且非瞬态状态(仅)从 共享对象。

因此,如果您不想缓存瞬态,则可以禁用内部 weaving ("eclipselink.weaving.internal"="false"),这个还是会 允许编织 LAZY 和更改跟踪。

您也可以禁用共享缓存,或完全禁用编织, 或配置您的实体的 CopyPolicy,或使用 DescriptorEvent postClone/postMerge。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2012-09-01
    • 2011-06-01
    • 2010-10-28
    • 2019-03-04
    相关资源
    最近更新 更多