В нашем приложении нам нужно иметь поля, которые можно назначать только один раз.
Сначала мы думали инкапсулировать поля и сделать сеттеры приватными. Однако возникают некоторые вопросы:
- Может ли Hibernate без общедоступного установщика сопоставить поле из базы данных?
- Могу ли я удалить установщик и сделать поле изменяемым только в конструкторе объектов?
- Наконец, есть ли какой-нибудь стандартный способ JPA сделать поле неизменным?
Заранее спасибо.
Ответ 2 · рейтинг 16 · KaiThomasWerther
Пытаться
@Column(updatable = false)
И сделайте свой сеттер приватным. (Оставьте свой геттер общедоступным, если хотите)
Я думаю, что это лучшая практика.
PS: JPA использует доступ к полю, если вы аннотируете свои поля, и использует доступ к получателю/установщику, если вы аннотируете свой метод получения.
Ответ 3 · рейтинг 3 · Piotr Nowicki
В JPA 2.0 у вас есть два способа определить, какие атрибуты должны быть сохранены:
- Access(FIELD) - имя полей сохраняется,
- Access(PROPERTY) - имя свойств сохраняется.
Если аннотация Access(-) не используется, решение о том, какой доступ будет использоваться, зависит от того, где вы поместите аннотацию @Id. Если вы поместите его рядом с вашим полем - будет использоваться Доступ (ПОЛЕ). Если вы поместите его рядом с вашим аксессором - будет использоваться Access(PROPERTY).
Поэтому, если вы используете Access(FIELD), вам не нужно иметь соответствующий метод доступа в стиле JavaBeans для определенного поля. У вас может быть частное поле с именем "myField" и общедоступный установщик для него с именем "public setBlahBlah(-)". JPA сохранит только "myField".
Ответ 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;
}
}