是否可以在Hibernate / JPA中使用不可变字段?

时间:2011-10-29 19:29:02

标签: java hibernate jpa-2.0 immutability

在我们的应用程序中,我们需要只能分配一次的字段。

首先,我们考虑封装字段并将setter设为私有。但是,有些问题会引起:

  • 如果没有公共设置器,Hibernate是否仍能从数据库中映射字段?
  • 我可以剥离setter并仅在实体构造函数中使字段可变吗?
  • 最后,是否有任何标准的JPA方法使字段不可变?

提前致谢。

5 个答案:

答案 0 :(得分:15)

  • 广告。 1:我认为如果注释放在字段上而不是放在getter上,JPA会使用普通的私有字段进行读取和写入。最近我发现Hibernate作为底层JPA提供程序甚至根本不需要get*()set*()方法。这是一个真正具有启发性的解决方案,因为从一开始我认为Hibernate需要访问器。所以答案是:就Hibernate而言,你不需要setter

  • 广告。 2:但是请注意,Hibernate仍然需要no-arg构造函数,否则它将无法加载具有描述性异常的实体。这也是JPA的要求。

  • 广告。 3:不,没有。请记住,您的收藏品也必须是不可变的。

答案 1 :(得分:9)

尝试

@Column(updatable = false)

让你的二传手变得私密。 (如果你愿意,可以公开你的获取者)

我认为这是最好的做法。

P.S。:JPA使用字段访问,如果您注释字段并使用getter / setter访问,如果您注释getter方法。

答案 2 :(得分:3)

在JPA 2.0中,您有两种方法可以定义应该保留哪些属性:

  1. 访问(FIELD) - 字段名称是持久的,
  2. 访问(PROPERTY) - 属性名称保持不变。
  3. 如果没有使用Access( - )注释,则决定使用哪种访问权限取决于您放置@Id注释的位置。如果将它放在您的字段旁边 - 将使用Access(FIELD)。如果你把它放在你的访问者旁边 - 将使用Access(PROPERTY)。

    因此,如果使用Access(FIELD),则不必为特定字段配备适当的JavaBeans样式访问器。您可以拥有一个名为“myField”的私有字段和一个名为“public setBlahBlah( - )”的公共setter。 JPA将仅保留'myField'。

答案 3 :(得分:2)

尝试

@Column(updatable = false)

来自javadoc:

  

该列是否包含在由...生成的SQL UPDATE语句中   持久性提供者。

答案 4 :(得分:1)

您可以使用@Entity(mutable=false)@Immutable注释标记框架,以便在缓存等方面利用此事实来提高性能。 (休眠)

然后你可以使用这样的不可变包装类:

public class ImmutableStuff {
    private final FooField barValue;

    public ImmutableStuff(Stuff stuff) {
        barValue = stuff.barValue;
    }

    public FooField getBarValue(){
        return barValue;
    }
}