Java H2/PostgreSQL/Hibernate:使用共享锁会导致org.H2.jdbc.JdbcSQLException

Java H2/PostgreSQL/Hibernate:使用共享锁会导致org.H2.jdbc.JdbcSQLException,java,postgresql,hibernate,locking,h2,Java,Postgresql,Hibernate,Locking,H2,在生产环境中,我运行PostgreSQL 9.6和Hibernate 5.4.16。以下代码工作正常: final CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); final CriteriaQuery<JpaClass> query = cb.createQuery(JpaClass.class); final Root<JpaClass> fromClass = query.fro

在生产环境中,我运行PostgreSQL 9.6和Hibernate 5.4.16。以下代码工作正常:

  final CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
  final CriteriaQuery<JpaClass> query = cb.createQuery(JpaClass.class);
  final Root<JpaClass> fromClass = query.from(JpaClass.class);
  final Join<JpaClass, JpaObject> classObjects = fromClass.join(JpaClass_.object);
  query.select(fromClass).where(cb.equal(classObjects.get(JpaObject_.objectId), objectId));
  final TypedQuery<JpaClass> tq = getEntityManager().createQuery(query);
  final EntityGraph<JpaClass> graph = createClassEntityGraph();
  tq.setHint(JpaRepository.JAVAX_PERSISTENCE_LOADGRAPH, graph);
  tq.setLockMode(LockModeType.PESSIMISTIC_READ);
  return tq.getSingleResult();
这是我用于H2的连接信息:

   private static final String JDBC_URL = "jdbc:h2:mem:history;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;MVCC=FALSE";
我已经发现的事情:

  • 在Hibernate查询生成器中删除锁定模式时,测试 运行良好
  • H2连接选项MVCC、MVU存储、, 选择\u进行\u更新\u MVCC不解决问题,除非我有 从这些中选择了错误的组合
  • Hibernate5.1不存在这个问题(但我不能从5.4返回)

任何人都可以帮助我吗?

H2 1.4.200在尝试使用
MVCC
SELECT\u FOR\u UPDATE\u MVCC
设置时引发异常,因此您的连接URL实际上未被使用。这些设置仅适用于1.4.197及更早版本。无论如何,您不能将Hibernate的PostgreSQL方言与H2一起使用,这些方言只使用PostgreSQL的一些功能,例如在查询中共享。您的测试配置中存在一些问题,需要在此处显示。这是另一个很好的示例,说明为什么在不同的数据库系统上进行测试,而不是在生产中使用的数据库系统上进行测试。H2 1.4.200在尝试使用
MVCC
SELECT\u FOR\u UPDATE\u MVCC
设置时引发异常,因此,您的连接URL实际上未被使用。这些设置仅适用于1.4.197及更早版本。无论如何,您不能将Hibernate的PostgreSQL方言与H2一起使用,这些方言只使用PostgreSQL的一些功能,例如在查询中共享。您的测试配置中有一些问题,需要在这里说明。这是另一个很好的例子,说明为什么在不同的数据库系统上进行测试,而不是在生产中使用的数据库系统上进行测试。
   private static final String JDBC_URL = "jdbc:h2:mem:history;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;MVCC=FALSE";