是否可以在 Hibernate/JPA 中具有不可变字段?

2022-09-02 00:55:17

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

起初,我们考虑封装字段并使设置者私有。但是,有些问题会引起:

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

提前致谢。


答案 1

尝试

@Column(updatable = false)

并使您的设置者私密。(如果你愿意,把你的观众留给公众)

我认为这是最佳做法。

P.S.:如果您为字段添加注释,JPA 将使用字段访问;如果您注释 getter 方法,则使用 getter/setter 访问权限。


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

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

  • Ad. 3:不,没有。请记住,您的集合也必须是不可变的。