1

我正在尝试编写一个应该提供宁静界面的小型应用程序。这在它自己的作品中与当前的休眠版本相对较好。

尝试测试时,我的服务器端代码修改如下:

EntityManager manager = // [...]
manager.getTransaction.begin();
AEntity entity1 = manager.find(AEntity.class, 4711);

entity1.setSomething("whatever");
manager.merge(entity1);

manager.getTransaction.commit();
manager.close();

通常这应该工作。但是当使用 JUnit 进行测试时,它不会。

EntityManager manager = // [...]
// insert some test data

Response r1 = target(url).request().put(someAEntityChangeInfo);
assertEquals(200, r1.getStatus());
manager.refresh(mAEntity);
assertEquals("whatever", mAEntity.getSomething()); // was set and commited on server-side

最后一个断言失败,说mAEntity(应该更新)包含旧数据。我也不确定这种行为是否可能是一种竞争条件,因为有一次(但只有一次)断言是可以的。

如何在断言之前确保数据真正被提交?

使用 MariaDB、MariaDB Connector/J、Hibernate 5.0.7 和 Jersey 2.22.1。

4

1 回答 1

0

问题似乎是刷新事务和连接隔离的混合。

要解决此问题:

  • 将刷新模式设置为提交:manager.setFlushMode(FlushModeType.COMMIT);
  • 将用于测试的连接隔离设置为,READ_COMMITED以便测试连接能够看到测试代码对另一个 EntityManager 所做的更改。对于生产来说,更高的隔离度会更好。JPA 属性:<property name="hibernate.connection.isolation" value="2" />

还有hibernate的autocommit属性。设置false为保持对行为的更多控制。

于 2016-02-09T10:41:17.360 回答