环境:JBoss Seam,JPA,Hibernate
我们使用@PostLoad注释动态初始化@Entity中的一些瞬态变量(有时这涉及查找父实体以初始化状态 - 这是一项代价高昂的操作)。
但在某些情况下,我们不希望这个@PostLoad被触发,因为我们不会依赖瞬态变量。
有没有办法在加载后动态控制数据。
解决此问题的一种方法是仅按需调用此方法(即删除@PostLoad注释并手动调用此方法),但这也容易出错。
还有其他方法可以解决此问题。
答案 0 :(得分:1)
但在某些情况下,我们不希望这个@PostLoad被触发,因为我们不会依赖瞬态变量。
创建两个实体,一个包含@PostLoad
和一个瞬态字段,另一个包含“更轻”的实体。
答案 1 :(得分:0)
没有在java中处理过这个,但在kotlin + maven + spring项目中遇到过类似的事情。
了解@PostLoad 的工作原理?
@PostLoad
在使用实体管理器方法获取数据后调用,find()
或 refresh()
操作被触发到数据库。
触发@PostLoad 失败的场景:
假设一个 parent
实体有这个 @transient variable
,它使用 @PostLoad
方法初始化。而且,您有一个子实体映射到该父实体。
当您检索 child
时,将加载查找并生成持久性上下文。当您尝试访问父内容时,会触发另一个查找。但这不会触发 @PostLoad
的 parent
方法,因为该操作是从现有上下文触发的。
通常会抛出未初始化的错误。
解决方案
在上面的场景中,我真的不需要多个实体。因为我知道这种行为。我会为 parent
创建一个实体类方法来动态加载相应瞬态变量的内容,甚至为特殊场景设置一些默认值。并在转换器方法或用例中触发或管理此方法。