Какая польза от создания геттеров и сеттеров в классе, аннотированном @Entity (Hibernate)? Когда они вызываются?
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
private String firstName;
private String lastName;
public Student() {
}
public Student(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
//other getters and setters
}
Как только ваши поля станут закрытыми, вам понадобятся геттеры и сеттеры для доступа к ним вне класса сущностей.
По умолчанию Hibernate использует геттеры и сеттеры для доступа к атрибутам объекта, что считается распространенным подходом.
Однако это не является строго обязательным для Hibernate. Если ваши поля отмечены public, вы можете указать Hibernate обращаться к этим полям напрямую (через опцию public). С другой стороны, имея access, private или default поля/геттеры/сеттеры, Hibernate может работать и с ними (думаю, через рефлексию).
Из Ссылка на Hibernate:
2.1.3. Объявить геттеры и сеттеры для постоянных атрибутов
Стандартный портативный JPA по существу требует этого. В противном случае ваша модель нарушать указанное выше требование в отношении доступа к поля постоянного состояния объекта непосредственно извне объекта сам. Хотя Hibernate этого не требует, рекомендуется следовать Соглашения JavaBean путем определения геттеров и сеттеров для ваших сущностей постоянные атрибуты. Вы по-прежнему можете указать Hibernate для прямого доступа поля сущности. Атрибуты (будь то поля или геттеры/сеттеры) не нужно объявлять общественный. Hibernate может работать с атрибутами, объявленными с помощью public, защищенная, пакетная или частная видимость. Опять же, если вы хотите использовать Генерация прокси во время выполнения для ленивой загрузки видимости для геттер/сеттер должен быть как минимум видимым для пакета.
Просто чтобы добавить к этому, используйте Lombok для ваших геттеров и сеттеров. Просто аннотируйте свой класс с помощью @Getter и @Setter, и вам не нужно заполнять свой класс этими методами доступа. Вы также можете использовать @Data, который включает в себя равенство и хэш-код, но не используйте @Data для своих сущностей.