【问题标题】:Different Persistance Behaviour with In-Memory and MySQL DBIn-Memory 和 MySQL DB 的不同持久性行为
【发布时间】:2018-07-10 11:30:38
【问题描述】:

我有一个父实体和一个具有一对多关系的子实体。

使用@DataJpaTest(即配置内存数据库)时,以下操作按预期工作:

LOG.info("Creating stops");
Stop stop1 = new Stop(new Time(0), "Acton Town", new HashSet<>());
Set<Stop> stops = new HashSet<>();
stops.add(stop1);

LOG.info("Creating and persisting routes");
Route route = routeRepository.save(new Route("something", "return"));

LOG.info("Adding stops to route");
stops.forEach(route::addStop);

它正确插入了路由和每个子节点,我可以稍后获取路由并返回相同的信息。

但是,当我在使用真实数据源(本地 MySQL 数据库)的同时在服务中重复此操作时,似乎不会发生 CASCADE.ALL 持久化,我最终没有插入停靠点,但路由保持不变并分配了一个 ID。

我已通过在配置双向关系的父级中使用“addEntity”方法来遵循站点周围的建议,但它在测试套件之外不起作用。

有人知道为什么会这样吗?

【问题讨论】:

    标签: spring hibernate spring-data-jpa h2 hibernate-cascade


    【解决方案1】:

    所以我的测试和我的服务之间的区别之一是使用 entityManager.flush()。

    通过将@Transactional 添加到我的服务方法中,孩子们得到了持久化,因为这将方法调用包装在基本上执行此操作的 AOP 代理中:

    transaction.begin()
    service.method()
    transaction.commit()
    

    似乎我的孩子没有被坚持,因为我基本上没有告诉 hibernate 什么时候做。

    我之前在其他服务中没有注意到它的原因是,我使用 CrudRepository 来保存实体,这将确保立即填充 id 字段,因此这实际上会提交事务。

    它也可能受到我工作的多租户环境的影响,我有多个事务管理器。如果您是这种情况,您可能必须使用事务注释指定哪一个,如下所示:

    @Transactional("nameoftransactionmanager")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2014-09-08
      • 2014-11-11
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      相关资源
      最近更新 更多