Hibernate всегда нужен сеттер, когда есть геттер? - PullRequest
55 голосов
/ 20 апреля 2010

У нас есть несколько методов получения Hibernate, аннотированных как @Column, так и @Basic.

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

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

Ответы [ 5 ]

74 голосов
/ 20 апреля 2010

Как уже упоминали другие, если вы аннотируете метод получения свойства, то Hibernate использует этот метод при чтении значений из базы данных. По сути, Hibernate предполагает, что все, что он записывает в базу данных, в конечном итоге необходимо будет прочитать из базы данных. Это подразумевает, что если вы аннотируете геттер, то он должен вызывать сеттер при чтении объекта из базы данных.

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

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

9 голосов
/ 20 апреля 2010

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

4 голосов
/ 02 декабря 2014

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

<class name="com.demo.hibernate.Country" table="country">
  <id name="countryId" column="id" type="int">
    <generator class="increment" />
  </id>
  <property name="name" column="name" access="field" type="string" />
  <property name="countryCode" column="country_code" access="field" type="string" />
</class>
1 голос
/ 20 апреля 2010

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

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

0 голосов
/ 20 апреля 2010

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

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

...