有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案