我有一个父实体和一个具有一对多关系的子实体。
使用 @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 数据库)时在我的服务中重复此操作时,级联。ALL 持久似乎没有发生,我最终没有插入停靠点,但路线被持久化并分配了一个 ID。
我遵循了站点周围的建议,在配置双向关系的父级中使用了"addEntity"方法,但它在测试套件之外不起作用。
有谁知道为什么会这样?
所以我的测试和我的服务之间的区别之一是使用了entityManager.flush()。
通过将@Transactional添加到我的服务方法中,子项将持久化,因为这会将方法调用包装在本质上执行以下操作的 AOP 代理中:
transaction.begin()
service.method()
transaction.commit()
似乎我的孩子没有坚持下去,因为我基本上没有告诉冬眠什么时候这样做。
我之前在其他服务中没有注意到它的原因是我使用 CrudRepository 来保存实体,这将确保立即填充 id 字段,因此这基本上会提交事务。
它还可能受到我工作的多租户环境的影响,我有多个事务管理器。如果是这种情况,您可能必须指定具有事务注释的哪一个,如下所示:
@Transactional("nameoftransactionmanager")