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