我刚刚开始使用 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 实践:不可变对象为此做了一个非常有力的论据)。那么,即使我将每个字段都声明为“final”,是否有任何方法可以让 Hibernate 正常工作?
我知道 Hibernate 使用反射来实例化它的类,因此需要能够调用某种构造函数,而不会冒险选择错误的构造函数或将错误的值传递给它的参数之一,所以它可能更安全调用无参数构造函数并一次将每个字段设置为一个。但是,难道不能向 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
,但似乎不应该是遥不可及的。