jpa 从Sping Boot + Hibernate获取现有的Session /BattyManager/BattyManagerFactory

yb3bgrhw  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(119)

我需要获取现有的Session或SessionFactory或SessionManagerFactory,它们是通过Sping 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 /SectyManagerFactory自己创建和扫描一切,忽略Spring已经做的一切,然后抱怨什么都找不到/没有配置/什么都没有。
显然,我不希望应用程序停止并重新构建一切,只是重用已经存在的Spring对象。
我该怎么做呢?

kkbh8khc

kkbh8khc1#

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

相关问题