Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 内存和MySQL数据库中的不同持久性行为_Spring_Hibernate_Spring Data Jpa_H2_Hibernate Cascade - Fatal编程技术网

Spring 内存和MySQL数据库中的不同持久性行为

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

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

使用@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);
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")