【问题标题】:How to calculate a persistent property based on transient property before persist?如何在持久之前根据瞬态属性计算持久属性?
【发布时间】:2017-01-10 17:49:51
【问题描述】:

假设我在一个实体中有一个持久属性A,以及两个瞬态字段T1T2。当实体被持久化时,我需要根据T1T2计算A(假设这是一个无法更改的遗留数据库)。

@Entity
Class MyEntity {
    @Column(name="persistantA")
    Integer A;

    @Transient
    Integer T1;

    @Transient
    Integer T2;

    @PrePersist
    void prePersist() {
        A = T1 * T2;
    }
}

但是在 prePersist() 方法中,所有瞬态字段都被清除 --- 它们被设置为其初始值 --- 这似乎是 Hibernate/Jpa 的正确行为。

如何克服这个问题?

我正在使用带有 Jpa 和 Hibernate 的 Spring Boot。

【问题讨论】:

    标签: java hibernate jpa transient


    【解决方案1】:

    如果您通过调用EntityManager::persist 持久化一个新实体,那么您描述的行为将不会发生,并且瞬态字段将在@PrePersist 方法中可见。

    但是,如果您使用 EntityManager::merge 持久化一个新实体,则合并机制将忽略瞬态字段,这是预期的行为 - 只有 Hibernate 知道的属性被合并。请记住,merge 始终返回一个副本(除非参数已经是托管实例),因此您必须手动将瞬态字段复制到 merge 操作的结果中。

    【讨论】:

    • 你是对的。但是我想为 persit() 和 merget() 执行转换。我最后通过在setter方法中调用transform函数解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2015-02-01
    • 2012-02-18
    相关资源
    最近更新 更多