【问题标题】:Entities are not persisted into Database if @transactional is attached to certain method如果@transactional 附加到某个方法,实体不会持久化到数据库中
【发布时间】:2020-04-12 11:11:54
【问题描述】:

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

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

我发现的问题是:

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

我的问题是:

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

谢谢。

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

...
}

【问题讨论】:

    标签: java spring hibernate transactions


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢您的洞察!顺便问一下,如何“将实体附加到会话”?
    • 您需要自动装配sessionFactory 并将对象合并到Hibernate 会话:MyEntity mergedEntity = (MyEntity) sessionFactory.merge(toBeSaved);
    • 谢谢,我没有看到 sessionFactory 可用的“合并”方法?我看到错误“找不到符号符号:方法合并(库存调整)位置:SessionFactory 类型的变量 sessionFactory”你的意思是 org.hibernate.SessionFactory 吗?还是我的休眠 jar 太旧了?
    • Hibernate 我使用的是: org.hibernatehibernate-core5.1 .0.Finalorg.hibernatehibernate-entitymanager5.1.0.Final
    • 我尝试在“persistEnity”处附加“事务”,并在“persistEnity”中添加:session.merge(toBeSaved),但仍然没有保存实体。对不起,我不能为你缩进。代码是:会话会话;尝试 { session = sessionFactory.getCurrentSession(); } catch (Exception ex) { session = sessionFactory.openSession(); } // 会议。 Inventoryadjustment mergeEntity = (Inventoryadjustment) session.merge(toBeSaved);
    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多