如果将@transactional附加到某些方法,实体将不会持久保存到数据库中

时间:2019-12-19 20:54:11

标签: java spring hibernate transactions

我是spring和hibernate的新用户。 我有一个服务类,该类由控制器调用。 呼叫流程如下:

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

我发现的问题是:

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

我的问题是:

  • 为什么会这样? (这是因为调用流程引起的吗?也就是说,@ transactional必须附加到由控制器类调用的服务类的第一个方法上才能起作用?)

谢谢。

伪代码如下:

@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);
    }

...
}

1 个答案:

答案 0 :(得分:0)

因为方法convertToEntityMyEntity中创建对象类型create,并且如果该方法是事务性的,则该对象将被附加到会话中。但是,如果该方法不是事务性的,则可以在会话外创建新对象并将其发送到persistEnity,但是该对象没有附加,因此dao无法在没有新附加到会话的情况下保存它。

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