我需要获取现有的 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 对象即可。
我该怎么做?
在这种情况下修复实体扫描的答案是错误的。问题是尝试取消代理列表时会发生异常。但是 Hibernate 不知道如何取消代理列表,它似乎丢失了其原始数据,所以我找到的唯一解决方案是,但仅适用于列表,重新加载容器并在该事务会话中初始化列表。
此外,
session.merge(object)
不会将对象重新附加到会话,因此在 merge
之后无法取消代理。相反,session.update(object)
可以工作,尽管它已被标记为已弃用。