Позвольте мне попытаться суммировать наиболее важные причины выбора полевого доступа. Если вы хотите погрузиться глубже, прочитайте эту статью в моем блоге: Стратегии доступа в JPA и Hibernate - что лучше, доступ к полю или собственности?
Полевой доступ - безусловно, лучший вариант. Вот 5 причин для этого:
Причина 1: лучшая читаемость вашего кода
Если вы используете полевой доступ, вы аннотируете свои атрибуты сущности с помощью аннотаций сопоставления. Поместив определение всех атрибутов сущности в начало вашего класса, вы получите относительно компактное представление всех атрибутов и их отображений.
Причина 2: пропустить методы получения или установки, которые не должны вызываться вашим приложением
Другое преимущество полевого доступа заключается в том, что ваш поставщик сохраняемости, например Hibernate или EclipseLink, не использует методы получения и установки атрибутов вашей сущности. Это означает, что вам не нужно предоставлять какой-либо метод, который не должен использоваться вашим бизнес-кодом. Чаще всего это относится к методам установки сгенерированных атрибутов первичного ключа или столбцов версий. Ваш поставщик сохраняемости управляет значениями этих атрибутов, и вам не следует устанавливать их программно.
Причина 3: Гибкая реализация методов получения и установки
Поскольку ваш поставщик сохраняемости не вызывает методы получения и установки, они не обязаны выполнять какие-либо внешние требования. Вы можете реализовать эти методы любым удобным для вас способом. Это позволяет вам внедрять специфичные для бизнеса правила проверки, запускать дополнительную бизнес-логику или преобразовывать атрибут сущности в другой тип данных.
Вы можете, например, использовать это для обертывания необязательной ассоциации или атрибута в Java Optional
.
Причина 4: нет необходимости отмечать служебные методы как @Transient
Еще одним преимуществом стратегии доступа на местах является то, что вам не нужно аннотировать свои служебные методы с помощью @Transient
. Эта аннотация сообщает поставщику постоянства, что метод или атрибут не являются частью постоянного состояния объекта. А поскольку при доступе по типу поля постоянное состояние определяется атрибутами вашей сущности, ваша реализация JPA игнорирует все методы вашей сущности.
Причина 5: избегать ошибок при работе с прокси
Hibernate использует прокси-серверы для лениво извлеченных связей one-one , чтобы он мог контролировать инициализацию этих ассоциаций. Такой подход прекрасно работает практически во всех ситуациях. Но это создает опасную ловушку, если вы используете доступ на основе собственности.
Если вы используете доступ на основе свойств, Hibernate инициализирует атрибуты прокси-объекта при вызове метода getter. Это всегда так, если вы используете прокси-объект в своем бизнес-коде. Но довольно много equals и реализаций hashCode обращаются к атрибутам напрямую. Если вы обращаетесь к любому из атрибутов прокси впервые, эти атрибуты по-прежнему не инициализированы.