java - 如果@transactional附加到某些方法,实体不会持久化到数据库中

标签 java spring hibernate transactions

我是 spring 和 hibernate 的新用户。 我有一个服务类,由 Controller 调用。 调用流程是这样的:

  1. controll 调用 myService.create 方法,然后
  2. myService.create 调用 myService.persistEnity 方法。
  3. 在 myService.persistEnity 方法中,有一个 dao 对象将实体持久保存到数据库。

我发现的问题是:

  1. 如果我将 @transactional 注释附加到“myService.create”方法,实体将被保存到数据库中。 然而,
  2. 如果我将 @transactional 注释附加到“myService.persistEnity”方法实体不会保存到数据库,并且我没有看到任何错误消息。

我的问题是:

  • 为什么会发生这种情况? (这是因为调用流程吗?即 @transactional 必须附加到 Controller 类调用的服务类的第一个方法才能工作?)

谢谢。

psudo代码如下:

@org.springframework.stereotype.Service("myService")
public class MyService {

@Autowired
private MyDao dao;

    // if the @Transactional is only put here as this, entities will NOT be saved to database.
    @Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
    public MyEntity persistEnity(MyEntity toBeSaved) {

        MyEntity entity = dao.persistEntity(toBeSaved);
        return entity;
    }

// if the @Transactional is only put here, entities will be saved to database.
//    @Transactional(value = "transactionManager", readOnly = false, propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
    public ServiceObject create(ServiceObject serviceObject, User user) {
        MyEntity entity = convertToEntity(serviceObject);
        entity = persistEnity(dao);
        return convertTOServiceObject(entity);
    }

...
}

最佳答案

因为方法 convertToEntitycreate 中创建了一个对象类型 MyEntity,并且如果此方法是事务性的,则将创建附加到 session 。但是,如果该方法不是事务性的,您可以在 session 之外创建新对象并将其发送到persistEnity,但它没有附加,因此dao无法在不将新对象附加到 session 的情况下保存它。

在创建对象的方法上保留事务性,或将其附加到 persistEnity 方法中的 session 中。

关于java - 如果@transactional附加到某些方法,实体不会持久化到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416766/

相关文章:

java - 将 C++ 代码转换为 JAVA

java - @Option(longName =“fileName”)在Java中是什么意思?

java - Spring security 登录后如何跳转到另一个页面

java - 数据库没有生成表

java - 如何在 HtmlUnit 中通过 Xpath 获取图像?

Java 将 ObjectInputStream 结果转换为 ArrayList

java - 为什么显示元素类型 "bean"后面必须跟有属性规范 ">"或 "/>".at <property name ="list">

java - Spring Data MongoDB <mongo :auditing/> cause IllegalArgumentException: Unsupported entity Could not determine IsNewStrategy

c# - 如何使用 Nhibernate 删除多个数据库实体?

java - 由 : java. io.FileNotFoundException : Could not open ServletContext resource [/applicationContext. xml 引起]