从 Spring Boot + Hibernate 获取现有的 Session / EntityManager / EntityManagerFactory

问题描述 投票:0回答:1

我需要获取现有的 Session 或 SessionFactory 或 EntityManagerFactory,它们是通过 Spring Boot 3 和 Hibernate 6 创建的。

但是,虽然我发现的所有解决方案都返回这些类的有效实例,但它们不起作用。最后他们崩溃了,比如:

java.lang.IllegalArgumentException: Unable to locate persister:
org.hibernate.collection.spi.PersistentBag

代码:

// Using either @PersistenceContext or @Autowired doesn't make a difference.
@PersistenceContext
private EntityManager entityManager;

@Transactional
public <T> T merge(T object) {
  Session session = entityManager.unwrap(Session.class);
  // Crash
  session.merge(object);

该异常的解决方案是修复实体扫描。但是实体扫描工作得很好,Spring 保存、查找和加载到处都是精彩的。看起来这个直接实例化的 Session / SessionFactory / EntityManagerFactory 自己创建并扫描所有内容,忽略 Spring 已经完成的所有内容,然后抱怨找不到任何内容/未配置/无论如何。

显然我不希望应用程序停止并重建所有内容,只需重用已经存在的 Spring 对象即可。

我该怎么做?

spring-boot hibernate jpa spring-data-jpa spring-data
1个回答
0
投票

在这种情况下修复实体扫描的答案是错误的。问题是尝试取消代理列表时会发生异常。但是 Hibernate 不知道如何取消代理列表,它似乎丢失了其原始数据,所以我找到的唯一解决方案是,但仅适用于列表,重新加载容器并在该事务会话中初始化列表。

此外,

session.merge(object)
不会将对象重新附加到会话,因此在
merge
之后无法取消代理。相反,
session.update(object)
可以工作,尽管它已被标记为已弃用。

© www.soinside.com 2019 - 2024. All rights reserved.