我是 spring 和 hibernate 的新用户。 我有一个服务类,由 Controller 调用。 调用流程是这样的:
- controll 调用 myService.create 方法,然后
- myService.create 调用 myService.persistEnity 方法。
- 在 myService.persistEnity 方法中,有一个 dao 对象将实体持久保存到数据库。
我发现的问题是:
- 如果我将 @transactional 注释附加到“myService.create”方法,实体将被保存到数据库中。 然而,
- 如果我将 @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);
}
...
}
最佳答案
因为方法 convertToEntity
在 create
中创建了一个对象类型 MyEntity
,并且如果此方法是事务性的,则将创建附加到 session 。但是,如果该方法不是事务性的,您可以在 session 之外创建新对象并将其发送到persistEnity,但它没有附加,因此dao无法在不将新对象附加到 session 的情况下保存它。
在创建对象的方法上保留事务性,或将其附加到 persistEnity
方法中的 session 中。
关于java - 如果@transactional附加到某些方法,实体不会持久化到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59416766/