Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Возможно ли иметь неизменяемые поля в Hibernate/JPA?

Автор вопроса: Carlos MeloОтветов: 5

В нашем приложении нам нужно иметь поля, которые можно назначать только один раз.

Сначала мы думали инкапсулировать поля и сделать сеттеры приватными. Однако возникают некоторые вопросы:

  • Может ли Hibernate без общедоступного установщика сопоставить поле из базы данных?
  • Могу ли я удалить установщик и сделать поле изменяемым только в конструкторе объектов?
  • Наконец, есть ли какой-нибудь стандартный способ JPA сделать поле неизменным?

Заранее спасибо.

javahibernateimmutability

Ответы

Ответ 1 · рейтинг 16 · Tomasz Nurkiewicz

  • Объявление. 1: Я считаю, что JPA использует простые частные поля как для чтения, так и для записи, если аннотации помещаются в поля, а не в геттеры. Недавно я обнаружил, что Hibernate как основной поставщик JPA вообще не нуждается в методах get*() и set*(). Это было действительно поучительное решение, так как с самого начала я думал, что Hibernate нужны аксессуары. Итак, ответ таков: вам не нужны сеттеры в том, что касается Hibernate.

  • Объявление. 2: Однако обратите внимание, что Hibernate по-прежнему нуждается в конструкторе без аргументов, иначе он не сможет загрузить объекты с описательным исключением. Это также требование JPA.

  • Объявление. 3: Нет, нет. Помните, что ваши коллекции также должны быть неизменяемыми.

Ответ 2 · рейтинг 16 · KaiThomasWerther

Пытаться

@Column(updatable = false)

И сделайте свой сеттер приватным. (Оставьте свой геттер общедоступным, если хотите)

Я думаю, что это лучшая практика.

PS: JPA использует доступ к полю, если вы аннотируете свои поля, и использует доступ к получателю/установщику, если вы аннотируете свой метод получения.

Ответ 3 · рейтинг 3 · Piotr Nowicki

В JPA 2.0 у вас есть два способа определить, какие атрибуты должны быть сохранены:

  1. Access(FIELD) - имя полей сохраняется,
  2. Access(PROPERTY) - имя свойств сохраняется.

Если аннотация Access(-) не используется, решение о том, какой доступ будет использоваться, зависит от того, где вы поместите аннотацию @Id. Если вы поместите его рядом с вашим полем - будет использоваться Доступ (ПОЛЕ). Если вы поместите его рядом с вашим аксессором - будет использоваться Access(PROPERTY).

Поэтому, если вы используете Access(FIELD), вам не нужно иметь соответствующий метод доступа в стиле JavaBeans для определенного поля. У вас может быть частное поле с именем "myField" и общедоступный установщик для него с именем "public setBlahBlah(-)". JPA сохранит только "myField".

Ответ 4 · рейтинг 3 · bbviana

Пытаться

@Column(updatable = false)

Из джавадока:

Включен ли столбец в операторы SQL UPDATE, созданные поставщиком сохраняемости.

Ответ 5 · рейтинг 1 · Desmond Zhou

Вы можете пометить объект аннотациями @Entity(mutable=false) или @Immutable для платформы, чтобы использовать этот факт для увеличения производительности при кэшировании и т. д. (спящий режим)

Затем вы можете использовать неизменяемый класс-оболочку следующим образом:

public class ImmutableStuff {
    private final FooField barValue;

    public ImmutableStuff(Stuff stuff) {
        barValue = stuff.barValue;
    }

    public FooField getBarValue(){
        return barValue;
    }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы