Hibernate:通过JPA提交MariaDB

时间:2016-02-08 17:27:47

标签: hibernate jpa jersey mariadb jersey-test-framework

我试着写一个应该提供一个安静的界面的小应用程序。这与它目前的hibernate版本一起工作相对较好。

在尝试测试时,我的服务器端代码可以像这样进行修改:

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。

1 个答案:

答案 0 :(得分:0)

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

要解决此问题:

  • 将flush-mode设置为commit:manager.setFlushMode(FlushModeType.COMMIT);
  • 将测试的连接隔离设置为READ_COMMITED,以便测试连接能够看到测试代码与另一个EntityManager所做的更改。为了生产更高的隔离度我会更好。 JPA-property:<property name="hibernate.connection.isolation" value="2" />

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