是否可以根据需要动态触发@PostLoad方法的调用

时间:2010-07-19 11:32:53

标签: java hibernate jpa orm

环境:JBoss Seam,JPA,Hibernate

我们使用@PostLoad注释动态初始化@Entity中的一些瞬态变量(有时这涉及查找父实体以初始化状态 - 这是一项代价高昂的操作)。

但在某些情况下,我们不希望这个@PostLoad被触发,因为我们不会依赖瞬态变量。

有没有办法在加载后动态控制数据。

解决此问题的一种方法是仅按需调用此方法(即删除@PostLoad注释并手动调用此方法),但这也容易出错。

还有其他方法可以解决此问题。

2 个答案:

答案 0 :(得分:1)

  

但在某些情况下,我们不希望这个@PostLoad被触发,因为我们不会依赖瞬态变量。

创建两个实体,一个包含@PostLoad和一个瞬态字段,另一个包含“更轻”的实体。

答案 1 :(得分:0)

没有在java中处理过这个,但在kotlin + maven + spring项目中遇到过类似的事情。

了解@PostLoad 的工作原理?

@PostLoad 在使用实体管理器方法获取数据后调用,find()refresh() 操作被触发到数据库。

触发@PostLoad 失败的场景:

假设一个 parent 实体有这个 @transient variable,它使用 @PostLoad 方法初始化。而且,您有一个子实体映射到该父实体。

当您检索 child 时,将加载查找并生成持久性上下文。当您尝试访问父内容时,会触发另一个查找。但这不会触发 @PostLoadparent 方法,因为该操作是从现有上下文触发的。

通常会抛出未初始化的错误。

解决方案

在上面的场景中,我真的不需要多个实体。因为我知道这种行为。我会为 parent 创建一个实体类方法来动态加载相应瞬态变量的内容,甚至为特殊场景设置一些默认值。并在转换器方法或用例中触发或管理此方法。