Hibernate java 10

4

我把我的应用程序从Java 8迁移到了Java 10。 但是现在,当尝试将某些内容存储到数据库中时,出现以下异常:

Caused by: javax.persistence.RollbackException: Error while committing the transaction
    at org.hibernate.internal.ExceptionConverterImpl.convertCommitException(ExceptionConverterImpl.java:77) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.3.18.RELEASE.jar:4.3.18.RELEASE]
... 91 more
Caused by: org.hibernate.AssertionFailure: Exception releasing cache locks
    at org.hibernate.engine.spi.ActionQueue$AfterTransactionCompletionProcessQueue.afterTransactionCompletion(ActionQueue.java:990) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.engine.spi.ActionQueue.afterTransactionCompletion(ActionQueue.java:513) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.internal.SessionImpl.afterTransactionCompletion(SessionImpl.java:2501) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.afterTransactionCompletion(JdbcCoordinatorImpl.java:479) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.afterCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:198) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$400(JdbcResourceLocalTransactionCoordinatorImpl.java:39) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:273) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:98) ~[hibernate-core-5.3.2.Final.jar:5.3.2.Final]
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) ~[spring-orm-4.3.18.RELEASE.jar:4.3.18.RELEASE]
... 91 more
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private jdk.internal.reflect.ConstructorAccessorImpl jdk.internal.reflect.DelegatingConstructorAccessorImpl.delegate accessible: module java.base does not "opens jdk.internal.reflect" to unnamed module @55283c54
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:337) ~[?:?]
    at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281) ~[?:?]
    at java.lang.reflect.Field.checkCanSetAccessible(Field.java:176) ~[?:?]
    at java.lang.reflect.Field.setAccessible(Field.java:170) ~[?:?]

我使用以下依赖项。
<spring.version>4.3.18.RELEASE</spring.version>
<spring-boot.version>1.5.14.RELEASE</spring-boot.version>
<hibernate-core.version>5.3.2.Final</hibernate-core.version>
<java.version>1.10</java.version>

尝试将 --add-opens java.base/jdk.internal.reflect=ALL-UNNAMED 添加到您的 JVM 参数中。 - Robert Hume
@RobertHume 我会尝试的。 - Иван Гладуш
@RobertHume 它帮了我,但我遇到了其他问题 Caused by: java.lang.reflect.InaccessibleObjectException: 无法使 jdk.internal.loader.ClassLoaders$AppClassLoader.ucp 字段为 final,因为模块 java.base 没有向未命名模块“opens jdk.internal.loader”开放它。你对此有什么看法? - Иван Гладуш
2
@ИванГладуш,您需要为所有这样的模块复制--add-opens java.base/jdk.internal.reflect=ALL-UNNAMED(将jdk.internal.reflect替换为适用的模块)。 - Ivan
@Ivan TY 你让我的一天变得更美好。 - Иван Гладуш
1个回答

5
这是根本原因。
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private jdk.internal.reflect.ConstructorAccessorImpl jdk.internal.reflect.DelegatingConstructorAccessorImpl.delegate accessible: module java.base does not "opens jdk.internal.reflect" to unnamed module @55283c54

Java 10引入了模块化概念,首先public不再是"那么"公开的了,反射也不再那么强大。
如@RobertHume所建议,您可以使用JVM标志,但实际上您需要迁移到支持Java9/10的较新Hibernate版本(如果有的话)。
另外,请查看此链接https://www.sitepoint.com/reflection-vs-encapsulation-in-the-java-module-system/#commandlineescapehatches,以获取有关建议的JVM标志的更多详细信息。

@ИванГладуш,如果你能把这个问题反馈给Hibernate开发人员,那就太好了。我敢打赌他们会很想知道这件事情的。 - M. Prokhorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接