java JPA:实体侦听器中具有生命周期回调的本机查询
TL;DR:为什么我对query.getSingleResult()
或query.getResultList()
的调用结果不由持久性上下文管理?我从实体管理器获取查询对象,所以它们绝对应该是,不是?这个问题表明它应该:When I use A JPA Query's getResultList(), are the results detached or managed?
因此,我在春季使用OpenJPA,并让实体监听器监听一些实体。实体侦听器侦听两个生命周期回调:预持久化和后加载。Pre-persist运行得很好,但是post-load从来没有发生过,因为我在我的存储库中使用本机查询(通过我的JpaRepository上的@Query
注释)
示例:
public interface MyEntityRepo extends JpaRepository<MyEntity, String> {
@Query(value = "...", nativeQuery = true)
private MyEntity someNativeQuery(String name, String id);
}
所以我想也许我应该“实现”这个存储库,通过em.createNamedQuery("...", MyEntity.class)
直接调用实体管理器,并用@NamedQuery
注释我的实体,这样返回的对象就由持久性上下文管理。这当然是我的一个假设,所以如果我错了,请随时纠正我,因为问题的其余部分就变得毫无意义了
现在的问题是,我使用本机查询是因为我想调用一些非SQL标准的特定于DB的函数,所以无论我做了什么,命名查询都无法实现。(也就是说,使用func('db_fun', parameters)
或function('db_fun', parameters)
会在获取数据时引发解析异常),因此我决定在我的实体上使用@NamedNativeQuery
注释和旧的本机查询
这再次未能触发加载后生命周期回调,即使它从数据库获取对象。你要做什么
实体
@NamedNativeQueries({@NamedNativeQuery(name = "...", query = "...", resultClass = MyEntity.class)})
@EntityListeners(MyEntityListener.class)
public class MyEntity implements Serializable {
...
}
实体侦听器
public class MyEntityListener {
@PostLoad
public postLoadFunction(MyEntity myEntity) {
... //never reached :(
}
}
存储库实施
public class MyEntityRepositoryImpl {
@PersistenceContext
private EntityManager em;
MyEntity myProblematicQuery(Object parameters, ...) {
TypedQuery<MyEntity> query = em.createNamedQuery("myNamedNativeQuery", MyEntity.class).setParameter(...);
return query.getSingleResult();
}
}
共 (0) 个答案