gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:15:59 25 4
gpt4 key购买 nike

我是 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/

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