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

|| 我有以下设置: 春季-> JPA->休眠-> PostgreSQL 我已经创建了一个服务层,该服务层提供了一些“ @Transactional \”方法来插入数据。在具体情况下,数据是必须连接到类别实体(标识关系)和某些图片实体(非标识关系)的人实体。 由于必须提供一个导入程序,因此我创建了一种导入CSV文件的方法(也@Transactional)。此方法首先尝试插入类别(使用em.persist()效果很好,该类在服务层调用的DAO中使用)。然后,我添加了一个新人,该人与之前添加的类别建立了联系(该类别已被加载,就好像它已经在数据库中-> HQL查询中一样),这也可以用作类别在运行的事务中保持不变。人员实体还使用em.persist()来持久化事务。 现在,我创建了图片实体并将它们连接到个人实体。连接他们之后,我也保存了该人,但是由于它已经保留在事务中,因此我使用em.merge()。在这里,我得到一个\“ EntityNotFoundException()\”,因为休眠(或jpa)无法从第一步开始加载类别(它具有正确的ID,但似乎看不到该事务)... 这三种方法insertCategory(),insertPerson()和addPicture()也都声明为@Transaction,因为它们在正常情况下是分开使用的。也许问题与嵌套事务有关,但似乎更多与em.merge()有关,因为em.persist()运行良好。 em是从spring注入的EntityManager。 任何想法出什么事了吗? 问候本     
已邀请:
        如果使用代理(事务处理的Spring默认值),则在类中调用方法时,@ Transactional批注将被忽略。以下内容不起作用:
@Transactional
public void doStuff() {
  this.doSomeOtherStuff();
}

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void doSomeOtherStuff() {
  // do some more db work here.
}
如果确实要这样做,则有两个选择: 使用AspectJ代替代理。这需要一点学习曲线。 将需要事务处理的方法移到另一个类中。 您可以在Spring文档中阅读有关此内容的更多信息。 在代理模式(默认设置)下,仅拦截通过代理传入的外部方法调用。这意味着,实际上,即使调用对象标有@Transactional,自调用实际上也不会导致实际事务在运行时在目标对象中调用目标对象的另一种方法。     

要回复问题请先登录注册