Kyl*_*ull 23 java hibernate final pojo
我刚刚开始使用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... */
}
Run Code Online (Sandbox Code Playgroud)
具体来说:没有任何字段被声明为final,并且必须有一个无参数构造函数,以便Hibernate框架可以实例化该类并设置其字段.
但事情就是这样 - 我真的不喜欢每当我能避免它时就以任何方式使我的类变得可变(Java实践:不可变对象为此做出了相当强烈的论据).那么,即使我要声明每个字段的"最终",有没有办法让Hibernate工作?
我知道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... */
}
Run Code Online (Sandbox Code Playgroud)
该@SetsProperty注释当然是虚构的,但似乎并不像它应该是遥不可及的.
Tad*_*pec 14
不可变对象是指没有修改其状态(即其字段)的方法的对象.这些领域不一定是最终的.因此,您可以删除所有mutators并将Hibernate配置为使用字段访问而不是访问器,或者您可以将no-arg构造函数和mutator标记为已弃用.这有点解决方法,但比没有更好.
小智 12
实际上在JDK 1.5+中,hibernate可以处理(通过反射)改变最终字段.创建一个受保护的默认构造函数(),将字段设置为某些默认值/ null等... Hibernate可以并且将在实例化对象时覆盖这些值.
这是可能的,这要归功于对Java 1.5内存模型的更改 - 感兴趣的更改(允许最终不是最终),以启用序列化/反序列化.
public class Event {
private final Long id;
private final String title;
private final Date date;
// Purely for serialization/deserialization
protected Event() {
id = null;
title = null;
date = null;
}
public Event(Long id, String title, Data date) {
this.id = id;
this.title = title;
this.date = date;
}
/* Accessor methods... */
Run Code Online (Sandbox Code Playgroud)
}
这听起来好像它不是Hibernate的一个用例,因为它执行的许多操作都涉及可变状态:
话虽这么说,如果你担心不变性,你可以选择使用copy-constructors为你的对象提供包装器:
public class FinalEvent {
private final Integer id;
public FinalEvent(Event event) {
id = event.id;
}
}
Run Code Online (Sandbox Code Playgroud)
它确实意味着额外的工作.
现在我正在考虑它,hibernate会话通常是线程绑定的,这至少会使最终字段的好处 - 安全发布.
您还在寻找最终领域的其他好处吗?
| 归档时间: |
|
| 查看次数: |
8771 次 |
| 最近记录: |