Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在持久化之前基于瞬态属性计算持久化属性?_Java_Hibernate_Jpa_Transient - Fatal编程技术网

Java 如何在持久化之前基于瞬态属性计算持久化属性?

Java 如何在持久化之前基于瞬态属性计算持久化属性?,java,hibernate,jpa,transient,Java,Hibernate,Jpa,Transient,假设我在一个实体中有一个持久属性a,以及两个瞬态字段T1,T2。当实体被持久化时,我需要根据T1,T2(假设这是一个不能更改的遗留数据库)计算A 但是在prePersist()方法中,所有瞬态字段都被清除——它们被设置为初始值——这似乎是Hibernate/Jpa的正确行为 如何克服这个问题 我将Spring boot与Jpa和Hibernate一起使用。如果通过调用EntityManager::persist来持久化一个新实体,那么您描述的行为将不会发生,并且在@PrePersist方法中可以

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

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

如何克服这个问题


我将Spring boot与Jpa和Hibernate一起使用。

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


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

你说得对。但是,我想对persit()和merget()执行转换。最后通过在setter方法中调用transform函数解决了这个问题。
@Entity
Class MyEntity {
    @Column(name="persistantA")
    Integer A;

    @Transient
    Integer T1;

    @Transient
    Integer T2;

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