Довольно странная ошибка, не правда ли?
java.lang.IncompatibleClassChangeError: Class org.hibernate.collection.spi.PersistentMap does not implement the requested interface java.util.Collection
Происходит явно где-то внутри самого Hibernate. Появляется на полях с типом java.util.Map, использование которых я уже описывал ранее. Но почему? Ведь до этого всё работало?
Особое внимание стоит обратить на IncompatibleClassChangeError. Именно это и было ключом к разгадке этой ошибки, на которую я потратил почти целый день. Что-то меняет класс, в результате чего он становится несовместимым с предыдущим. Со временем я начал понимать, что это явно как-то связано с плагином hibernate-enhance-maven-plugin, который я добавил в проект просто ради эксперимента:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<plugin> <groupId>org.hibernate.orm.tooling</groupId> <artifactId>hibernate-enhance-maven-plugin</artifactId> <version>${hibernate.version}</version> <executions> <execution> <configuration> <failOnError>true</failOnError> <enableLazyInitialization>true</enableLazyInitialization> <enableDirtyTracking>true</enableDirtyTracking> <enableAssociationManagement>true</enableAssociationManagement> <enableExtendedEnhancement>true</enableExtendedEnhancement> </configuration> <goals> <goal>enhance</goal> </goals> </execution> </executions> </plugin> |
Как видите, я здесь включил все опции, что нашёл. Видимо, этого не стоило делать.
Если убрать enableExtendedEnhancement, или поставить его в false, то ошибка исчезнет. На всякий случай, я вообще убрал все значения, чтобы они такими, какими описаны по умолчанию:
1 2 3 4 5 6 7 8 9 10 11 12 |
<plugin> <groupId>org.hibernate.orm.tooling</groupId> <artifactId>hibernate-enhance-maven-plugin</artifactId> <version>${hibernate.version}</version> <executions> <execution> <goals> <goal>enhance</goal> </goals> </execution> </executions> </plugin> |
Значения по умолчанию, судя по исходному коду плагина, такие:
- failOnError = true
- enableLazyInitialization = true
- enableDirtyTracking = true
- enableAssociationManagement = false
- enableExtendedEnhancement = false
В моем случае они не особо важны, да и в целом, я подумываю, что и сам плагин мне не особо нужен.
А что такое «enableExtendedEnhancement»?
Какое-то страшное древнее заклинание, о значении которого никто не помнит, или задокументированная фича?