Spring 内存和MySQL数据库中的不同持久性行为
我有一个父实体和一个具有一对多关系的子实体 使用@DataJpaTest(即配置内存中的数据库)时,以下各项按预期工作:Spring 内存和MySQL数据库中的不同持久性行为,spring,hibernate,spring-data-jpa,h2,hibernate-cascade,Spring,Hibernate,Spring Data Jpa,H2,Hibernate Cascade,我有一个父实体和一个具有一对多关系的子实体 使用@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
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);
LOG.info(“创建站点”);
Stop stop1=新站点(新时间(0),“阿克顿镇”,新哈希集());
Set stops=new HashSet();
停止。添加(停止1);
LOG.info(“创建和持久化路由”);
Route Route=routeRepository.save(新路由(“某物”、“返回”));
日志信息(“向路线添加站点”);
stops.forEach(路由::addStop);
它正确地插入了路由和每个子级,我可以稍后获取路由并返回相同的信息
但是,当我在使用真实数据源(本地MySQL DB)时在服务中重复此操作时,CASCADE.ALL persist似乎不会发生,我最终没有插入站点,但路由被持久化并分配了一个ID
我遵循了网站上的建议,在配置双向关系的父级中使用了“addEntity”方法,但在测试套件之外它不起作用
有人知道为什么会这样吗?所以我的测试和我的服务之间的一个区别是使用entityManager.flush() 通过将@Transactional添加到我的服务方法中,子方法得到持久化,因为这将方法调用封装在AOP代理中,该代理基本上完成了以下操作:
transaction.begin()
service.method()
transaction.commit()
我的孩子们似乎没有被坚持,因为我根本没有告诉hibernate什么时候去做
我以前在其他服务中没有注意到它的原因是,我使用crudepository来保存实体,这将确保立即填充id字段,因此这实际上将提交事务
它也可能受到我工作的多租户环境的影响,我在那里有多个事务管理器。如果是这种情况,您可能需要指定哪一个具有事务性注释,如下所示:
@Transactional("nameoftransactionmanager")