Я обновляю проект Spring 4.3.2 до Spring 5.1.5. Один из моих тестовых случаев начал давать сбой с ошибкой.
ClassNotFoundException: org.hibernate.property.DirectPropertyAccessor
Это имеет смысл, поскольку он устарел в Hibernate 5.x, который является самой низкой совместимой версией Hibernate для Spring 5.x. Я использую его в своем hbm.xml, как показано ниже:
<class name = "Notification"
table = "T_NOTIFICATION"
lazy = "false">
<id name = "id"
type = "integer"
column = "ID"
unsaved-value = "null"
access = "property">
<generator class = "identity"/>
</id>
<!-- A versioned entity. -->
<version name = "version"
column = "VERSION"
access = "org.hibernate.property.DirectPropertyAccessor"/>
Чем мне заменить поле доступа, чтобы сохранить такое же поведение?
@M.Deinum Приношу свои извинения, я отредактировал вопрос, чтобы лучше отразить то, что я пытался передать. Я не знаю, как работает access = "field"
. Я попробую.
access = "field"
сообщает hibernate, что вам нужен доступ к полю вместо использования геттера/сеттера, что также и DirectPropertyAccessor
. В конечном итоге это приведет к той же конфигурации, но с одним дополнительным преимуществом, которое можно перенести на более новые версии спящего режима.
Проблема не в версии Spring, а в версии Hibernate.
org.hibernate.property.DirectPropertyAccessor
устарела в версии 5.x спящего режима.
DirectPropertyAccessor
следует заменить на org.hibernate.property.access.internal.PropertyAccessFieldImpl
или org.hibernate.property.access.internal.PropertyAccessMixedImpl
в более высоких версиях спящего режима.
С org.hibernate.property.access.internal.PropertyAccessMixedImpl
вижу ошибку: Caused by: java.lang.NoSuchMethodException: org.hibernate.property.access.internal.PropertyAccessMixedImpl.<init>()
С org.hibernate.property.access.internal.PropertyAccessFieldImpl
вижу: Caused by: java.lang.NoSuchMethodException: org.hibernate.property.access.internal.PropertyAccessFieldImpl.<init>()
Я уже проверил этот решение, к сожалению, у меня он не сработал.
Я использую многие, вы можете быть более конкретным? Для Hibernate я использую hibernate-core:5.4.1.Final
Вам нужно создать новый класс, который реализует PropertyAccessFieldImpl, и указать этот класс в файле xml.
Какой implements
PropertyAccessFieldImpl? Но это не абстрактный класс или интерфейс. Он уже реализует PropertyAccess, можете ли вы привести пример, подтверждающий это?
Используя access=<class-name>
, вы должны использовать это только в том случае, если у вас есть свой собственный класс, который вы хотите использовать. Если вы хотите использовать прямой доступ к полю вместо свойств, используйте access = "field"
вместо того, что у вас есть сейчас. См. также Справочное руководство по спящему режиму.
Внутри ваша текущая версия будет использовать DirectPropertyAccessor
при обновлении Hibernate, она автоматически адаптируется к недавно введенному другому классу для использования. Теперь это бремя лежит на спящем режиме, а вам не нужно знать внутренний API спящего режима.
Спасибо, похоже именно то, что мне нужно. Я только что попробовал. Однако я все еще вижу ошибку, javax.persistence.TransactionRequiredException: no transaction is in progress at com.xxx.server.accessFabric.dao.impl.AccessPointDAOImplTest.setUp(AccessPointDAOImplTest.java:54)
Поскольку я не внес никаких изменений, кроме замены DirectPropertyAccessor
на field
. Я подозреваю, что это побочный эффект?
Вы пытаетесь сохранить что-то без транзакции, что и раньше должно было потерпеть неудачу. В этом отношении в Spring 5 произошли изменения с поддержкой спящего режима. Теперь он менее щадящий в случае неправильной конфигурации.
Я просто изменил свой комментарий выше. Короче говоря, были внесены изменения, касающиеся интеграции Spring 5 и спящего режима, так что это может привести к сбоям теста, если вы улучшите ситуацию. Вы, вероятно, увидите то же самое, если сохраните Spring 4.3.x и обновитесь только до Hibernate 5 (похоже, вы обновляете две вещи одновременно). Вот почему я всегда советую делать маленькие шаги вместо того, чтобы делать все сразу.
Конечно, можете ли вы указать мне документы, в которых описаны эти более строгие проверки конфигурации?
Нет, они где-то в журналах изменений для интеграции Spring 5/Hibernate 4+5.
пойду копать. Спасибо.
Какое отношение имеет устаревание в спящем режиме к Spring? Это связано со спящим режимом, а не с весной. Кроме того, почему бы просто не использовать
access = "field"
, который косвенно делает то же самое, без привязки к конкретной версии Hibernate.