Подтвердить что ты не робот

Всегда ли Hibernate нужен сеттер, когда есть геттер?

У нас есть некоторые методы гибернатного геттера, аннотированные как с @Column, так и @Basic.

Мы получаем исключение, если у нас нет соответствующего устройства. Почему это?

В нашем случае мы выводим значение, возвращаемое из получателя (чтобы получить его в БД), и у сеттера нет функциональной цели. Поэтому у нас просто есть пустой метод, чтобы обойти условие ошибки.

4b9b3361

Ответ 1

Как уже упоминалось, если вы аннотируете метод getter свойства, то Hibernate использует setter при чтении значений из базы данных. В принципе, Hibernate предполагает, что все, что он пишет в базу данных, в конечном итоге должно быть прочитано из базы данных. Это означает, что если вы аннотируете геттер, то при чтении объекта из базы данных ему нужно вызвать сеттер.

Вы можете сделать сеттер частным (Hibernate будет использовать отражение для доступа к сеттеру). Это отличный способ сохранить контракт вашего класса, продолжая использовать Hibernate для реляционного сопоставления.

Если поле получено из других свойств в классе, то почему вы храните его в базе данных? Вы можете использовать аннотацию @Transient, чтобы пометить поле, которое оно не должно храниться в базе данных. Вы даже можете использовать аннотацию @Formula, чтобы Hibernate вывел для вас поле (он делает это, используя формулу в запросе, который он отправляет базы данных).

Ответ 2

Вы должны аннотировать ваши классы с помощью @Entity(access = AccessType.FIELD) и аннотировать ваши атрибуты. Это должно решить вашу проблему. Средство настройки - лучший способ поддержать рефакторинг. И какая проблема с наличием там маленького сеттера.

Ответ 3

access = field, если вы не хотите использовать сеттеры

<id name="countryId" column="id" type="int">
<generator class="increment">
    </generator>

</id>
<property name="name" column="name" access="field" type="string"></property>
<property name="countryCode" column="country_code" access= "field" type="string"></property>

Ответ 4

Hibernate использует метод set для инициализации объекта, который вы читаете из своей базы данных.

Может быть, если вы создадите модификаторы доступа к полям объектов default или protected или public, то Hibernate будет инициализировать поля напрямую, не используя setter (я что-то читал, но я не уверен, что он работает). Но использование сеттера является гораздо более предпочтительным способом.

Ответ 5

Если вы не используете сеттеры и не используете частные атрибуты, Hibernate должен будет извлекать поля путем отражения и делать field.setAccessible(true). Я не думаю, что Hibernate делает это.

Я действительно не знаю, можем ли мы сообщить Hibernate об этом, но, насколько я помню, по умолчанию конфигурация использует сеттеры... Поместите log/sysout в набор, и вы увидите, что он использует сеттер.