Замена DirectPropertyAccessor?

Я обновляю проект 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"/>

Чем мне заменить поле доступа, чтобы сохранить такое же поведение?

Какое отношение имеет устаревание в спящем режиме к Spring? Это связано со спящим режимом, а не с весной. Кроме того, почему бы просто не использовать access = "field", который косвенно делает то же самое, без привязки к конкретной версии Hibernate.

M. Deinum 27.05.2019 10:46

@M.Deinum Приношу свои извинения, я отредактировал вопрос, чтобы лучше отразить то, что я пытался передать. Я не знаю, как работает access = "field". Я попробую.

Vivek Shankar 27.05.2019 10:51
access = "field" сообщает hibernate, что вам нужен доступ к полю вместо использования геттера/сеттера, что также и DirectPropertyAccessor. В конечном итоге это приведет к той же конфигурации, но с одним дополнительным преимуществом, которое можно перенести на более новые версии спящего режима.
M. Deinum 27.05.2019 10:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Проблема не в версии 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.PropertyAccessMixedIm‌​pl вижу ошибку: Caused by: java.lang.NoSuchMethodException: org.hibernate.property.access.internal.PropertyAccessMixedIm‌​pl.<init>() С org.hibernate.property.access.internal.PropertyAccessFieldIm‌​pl вижу: Caused by: java.lang.NoSuchMethodException: org.hibernate.property.access.internal.PropertyAccessFieldIm‌​pl.<init>() Я уже проверил этот решение, к сожалению, у меня он не сработал.

Vivek Shankar 27.05.2019 09:08

Я использую многие, вы можете быть более конкретным? Для Hibernate я использую hibernate-core:5.4.1.Final

Vivek Shankar 27.05.2019 09:27

Вам нужно создать новый класс, который реализует PropertyAccessFieldImpl, и указать этот класс в файле xml.

Abhijeet 27.05.2019 09:28

Какой implements PropertyAccessFieldImpl? Но это не абстрактный класс или интерфейс. Он уже реализует PropertyAccess, можете ли вы привести пример, подтверждающий это?

Vivek Shankar 27.05.2019 09:31
Ответ принят как подходящий

Используя 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(AccessPointDAO‌​ImplTest.java:54) Поскольку я не внес никаких изменений, кроме замены DirectPropertyAccessor на field. Я подозреваю, что это побочный эффект?

Vivek Shankar 27.05.2019 11:06

Вы пытаетесь сохранить что-то без транзакции, что и раньше должно было потерпеть неудачу. В этом отношении в Spring 5 произошли изменения с поддержкой спящего режима. Теперь он менее щадящий в случае неправильной конфигурации.

M. Deinum 27.05.2019 11:06

Я просто изменил свой комментарий выше. Короче говоря, были внесены изменения, касающиеся интеграции Spring 5 и спящего режима, так что это может привести к сбоям теста, если вы улучшите ситуацию. Вы, вероятно, увидите то же самое, если сохраните Spring 4.3.x и обновитесь только до Hibernate 5 (похоже, вы обновляете две вещи одновременно). Вот почему я всегда советую делать маленькие шаги вместо того, чтобы делать все сразу.

M. Deinum 27.05.2019 11:08

Конечно, можете ли вы указать мне документы, в которых описаны эти более строгие проверки конфигурации?

Vivek Shankar 27.05.2019 11:14

Нет, они где-то в журналах изменений для интеграции Spring 5/Hibernate 4+5.

M. Deinum 27.05.2019 11:14

пойду копать. Спасибо.

Vivek Shankar 27.05.2019 11:15

Другие вопросы по теме

Похожие вопросы