在我们的应用程序中,我们需要只能分配一次的字段。
首先,我们考虑封装字段并将setter设为私有。但是,有些问题会引起:
提前致谢。
答案 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中,您有两种方法可以定义应该保留哪些属性:
如果没有使用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;
}
}