gpt4 book ai didi

hibernate - Spring/JPA/Hibernate/PostgreSQL 在嵌套事务中抛出 EntityNotFoundException

转载 作者:行者123 更新时间:2023-11-29 12:22:45 25 4
gpt4 key购买 nike

我有以下设置:Spring -> JPA -> Hibernate -> PostgreSQL

我创建了一个服务层,它提供了一些“@Transactional”方法来插入数据。数据在具体情况下是一个人实体,它必须连接到一个类别实体(识别关系)和一些图片实体(非识别关系)。

因为我必须提供一个导入器,所以我创建了一个方法(也是@Transactional)来导入一个 csv 文件。此方法首先尝试插入类别(使用服务层调用的 DAO 使用的 em.persist() 效果很好)。然后我添加一个新人,它连接到我之前添加的类别(类别被加载就像它已经在数据库中 -> HQL 查询),这也因为类别在运行的事务中是持久的。个人实体还使用 em.persist() 在事务中持久化。

现在我创建图片实体并将它们连接到人物实体。连接它们之后,我也保存了这个人,但是因为它已经保存在我使用 em.merge() 的交易中。在这里我得到一个“EntityNotFoundException()”,因为 hibernate (或 jpa)无法从第一步加载类别(它有一个正确的 id,但它似乎看不到事务)...

所有三种方法 insertCategory()、insertPerson() 和 addPicture() 也被声明为 @Transaction,因为它们在正常用例中单独使用。也许问题与嵌套事务有关,但它似乎与 em.merge() 有关,因为 em.persist() 运行良好。

em 是一个从 spring 注入(inject)的 EntityManager。

知道出了什么问题吗?

问候本

最佳答案

如果您正在使用代理(事务处理的 Spring 默认设置),则在 类中调用方法时将忽略@Transactional 注释。以下将不起作用:

@Transactional
public void doStuff() {
this.doSomeOtherStuff();
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void doSomeOtherStuff() {
// do some more db work here.
}

如果您确实这样做,您有两个选择:

  1. 使用 AspectJ 而不是代理。这需要一点学习曲线。
  2. 将需要事务的方法移到另一个类中。

您可以在 Spring 文档中阅读更多相关信息 here .

在代理模式(默认)下,只有通过代理传入的外部方法调用才会被拦截。这意味着自调用实际上是目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法标有@Transactional,也不会在运行时导致实际事务。

关于hibernate - Spring/JPA/Hibernate/PostgreSQL 在嵌套事务中抛出 EntityNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6198958/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com