Я только начинаю работать с Hibernate, и все примеры, которые я вижу до сих пор, очень похожи на учебник в документации по Hibernate:
package org.hibernate.tutorial.domain;
import java.util.Date;
public class Event {
private Long id;
private String title;
private Date date;
public Event() {}
/* Accessor methods... */
}
В частности: ни одно из полей не объявлено как final
, и должен быть конструктор без аргументов, чтобы инфраструктура Hibernate могла создавать экземпляр класса и устанавливать его поля.
Но вот в чем дело - мне на самом деле не нравится делать мои классы изменяемыми в любом случае, когда я могу этого избежать (практика Java: неизменные объекты приводят довольно веские аргументы для этого). Так что есть ли способ заставить Hibernate работать, даже если бы я объявил каждое из полей 'final' ?
Я понимаю, что Hibernate использует Reflection для создания экземпляров своих классов и поэтому должен иметь возможность вызывать какой-либо конструктор без риска того, что он выберет неправильный конструктор или передаст неправильное значение одному из его параметров, поэтому вероятно, безопаснее вызывать конструктор без аргументов и устанавливать каждое поле по одному. Однако разве нельзя предоставить Hibernate необходимую информацию, чтобы он мог безопасно создавать неизменяемые объекты?
public class Event {
private final Long id;
private final String title;
private final Date date;
public Event(@SetsProperty("id") Long id,
@SetsProperty("title") String title,
@SetsProperty("date") Date date) {
this.id = id;
this.title = title;
this.date = new Date(date.getTime());
}
/* Accessor methods... */
}
Аннотация @SetsProperty
, конечно, вымышленная, но не кажется, что она должна быть вне досягаемости.