gpt4 book ai didi

java - 有没有办法为 Hibernate 管理的对象声明最终字段?

转载 作者:IT老高 更新时间:2023-10-28 20:33:18 25 4
gpt4 key购买 nike

我刚刚开始使用 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 实践:不可变对象(immutable对象)为这样做提供了一个非常有力的论据)。那么有没有办法让 Hibernate 工作,即使我将每个字段都声明为'final'

我知道 Hibernate 使用反射来实例化它的类,因此需要能够调用某种构造函数,而不会冒险选择错误的构造函数或将错误的值传递给它的参数之一,所以它是调用无参数构造函数并一次设置每个字段可能更安全。但是,难道不能向 Hibernate 提供必要的信息,以便它可以安全地实例化不可变对象(immutable对象)吗?

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 注释当然是虚构的,但似乎不应该遥不可及。

最佳答案

实际上在 JDK 1.5+ 中,hibernate 可以处理(通过反射)更改最终字段。创建一个 protected 默认构造函数(),将字段设置为一些默认值/空等... Hibernate 可以并且将在实例化对象时覆盖这些值。

这一切都归功于对 Java 1.5 内存模型的更改 - 为启用序列化/反序列化而进行的感兴趣的更改(允许 final 不是那么最终)。

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... */

}

关于java - 有没有办法为 Hibernate 管理的对象声明最终字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/912093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com