In-Memory 和 MySQL DB 的不同持久性行为
Posted
技术标签:
【中文标题】In-Memory 和 MySQL DB 的不同持久性行为【英文标题】:Different Persistance Behaviour with In-Memory and 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”方法来遵循站点周围的建议,但它在测试套件之外不起作用。
有人知道为什么会这样吗?
【问题讨论】:
【参考方案1】:所以我的测试和我的服务之间的区别之一是使用 entityManager.flush()。
通过将@Transactional 添加到我的服务方法中,孩子们得到了持久化,因为这将方法调用包装在基本上执行此操作的 AOP 代理中:
transaction.begin()
service.method()
transaction.commit()
似乎我的孩子没有被坚持,因为我基本上没有告诉 hibernate 什么时候做。
我之前在其他服务中没有注意到它的原因是,我使用 CrudRepository 来保存实体,这将确保立即填充 id 字段,因此这实际上会提交事务。
它也可能受到我工作的多租户环境的影响,我有多个事务管理器。如果您是这种情况,您可能必须使用事务注释指定哪一个,如下所示:
@Transactional("nameoftransactionmanager")
【讨论】:
以上是关于In-Memory 和 MySQL DB 的不同持久性行为的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 21版Database In-Memory LivaLabs实验(下)
MySQL Show Grants for... 与 mysql.db 和 information_schema.schema_privileges 不同
sql server 和mysql,orcal,db2有什麼不同?
HotRing: A Hotspot-Aware In-Memory Key-Value Store