Red Hat
Sep 12, 2018
by Guillaume Smet

JDK 11 is almost there and you might want to start testing your applications with it.

Your applications use Hibernate technologies? It shouldn’t be a problem but here are some important information.

Hibernate technologies and JDK 11 support

We started testing the Hibernate technologies with JDK 11 very early so we have some good news: Hibernate ORM (5.3.3+), Hibernate Search (5.10.4+) and Hibernate Validator (6.0.12+) can be used with JDK 11.

Note that, for now, even though we define automatic module names, running as Jigsaw modules is not fully tested and not expected to work.

A few quirks with ORM though

While Hibernate ORM 5.3 supports (and is tested with) JDK 11, there are a few things you need to tweak while waiting for Hibernate ORM 5.4.

JAXB dependency

JAXB is not provided by the JDK anymore so you need an external dependency for it:

<dependency>
          <groupId>javax.xml.bind</groupId>
          <artifactId>jaxb-api</artifactId>
          <version>2.3.0</version>
      </dependency>
      <dependency>
          <groupId>org.glassfish.jaxb</groupId>
          <artifactId>jaxb-runtime</artifactId>
          <version>2.3.0.1</version>
      </dependency>

These dependencies will be added in Hibernate ORM 5.4.

ByteBuddy experimental support

When using ORM with JDK 11, you might end up with the following exception coming from ByteBuddy:

Caused by: org.hibernate.bytecode.enhance.spi.EnhancementException: Failed to enhance class org.hibernate.jpa.test.enhancement.TestLazyPropertyOnPreUpdate
      	at org.hibernate.bytecode.enhance.internal.bytebuddy.EnhancerImpl.enhance(EnhancerImpl.java:117)
      	at org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner$2.loadClass(BytecodeEnhancerRunner.java:94)
      	... 40 more
      Caused by: java.lang.UnsupportedOperationException
      	at net.bytebuddy.jar.asm.ClassVisitor.visitNestMemberExperimental(ClassVisitor.java:248)
      	at net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:651)
      	at net.bytebuddy.jar.asm.ClassReader.accept(ClassReader.java:391)
      	at net.bytebuddy.pool.TypePool$Default.parse(TypePool.java:1051)

This is due to ASM (the component used by ByteBuddy to manipulate the bytecode) only supporting some JDK 11 features as experimental. ByteBuddy does the same and you need a specific flag to enable the support of these features.

To get everything in order, you need to add the following flag to your JVM: -Dnet.bytebuddy.experimental=true.

Hopefully, ASM 7 will be released soon.

Feedback, issues, ideas?

To get in touch, use the usual channels:

Original Post