Я только начинаю с 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 Practices: Immutable Objects делают довольно сильный аргумент для этого). Итак, есть ли способ заставить Hibernate работать, даже если я должен объявить каждое из полей "final"?
Я понимаю, что Hibernate использует Reflection для создания экземпляров своих классов и, следовательно, должен иметь возможность ссылаться на какой-то конструктор, не рискуя, что он выберет неправильный конструктор или передаст неправильное значение одному из своих параметров, поэтому он вероятно, безопаснее вызывать конструктор no-arg и устанавливать каждое поле по одному за раз. Однако не следует ли предоставлять необходимую информацию в 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
, конечно, фиктивная, но не кажется, что она должна быть вне досягаемости.