在我们的应用程序中,我们需要只能分配一次的字段。
起初我们考虑封装字段并使setter私有化。 但是,有些问题会引起:
如果没有公共设置器,Hibernate是否仍能从数据库中映射字段?
我可以剥离setter并仅在实体构造函数中使字段可变吗?
最后,是否有任何标准的JPA方法使字段不可变?
提前致谢。
广告。 1:我认为如果注释放在字段上而不是放在getter上,JPA会使用普通的私有字段进行读取和写入。最近我发现Hibernate作为底层JPA提供者根本不需要get*()和set*()方法。这是一个真正具有启发性的解决方案,因为从一开始我认为Hibernate需要访问器。所以答案是:就Hibernate而言,你不需要setter。
广告。 2:但是请注意,Hibernate仍然需要no-arg构造函数,否则它将无法加载具有描述性异常的实体。这也是JPA的要求。
广告。 3:不,没有。请记住,您的收藏品也必须是不可变的。
所以,对于字段访问:private字段+ Hibernate FIELD-access + no arg构造函数(用于Hibernate)+ arg构造函数(用于创建不可变对象)? 就是这样,@托马斯?
我只想补充一点,no-arg构造函数可以声明为private。 因此,如果您的Point类包含两个final字段:x和y,则可以使用一个公共构造函数Point(int x,int y)来使用客户端代码,使用私有构造函数Point()冬眠。 编写解释私有构造函数目的的注释将是一个好主意。
@ W.K.S甚至更好的想法是创建自定义注释(例如@ForHibernate)。 在添加注释(至少是eclipse)之后,IDE有可能会停止将该构造函数标记为未使用
尝试
@Column(updatable = false)
并使你的二传手私人。 (如果你愿意,可以公开你的获取者)
我认为这是最好的做法。
P.S。:JPA使用字段访问,如果您注释您的字段并使用getter / setter访问,如果您注释您的getter方法。
遗憾的是,这是真的,但是尝试更新列只会忽略该字段,如果程序员忘记该标志并假定它是可写的,则会导致可怕的错误。
在JPA 2.0中,您有两种方法可以定义应该保留哪些属性:
访问(FIELD) - 字段名称是持久的,
访问(PROPERTY) - 属性名称是持久的。
如果没有使用Access( - )注释,则决定使用哪种访问权限取决于您放置@Id注释的位置。如果将它放在您的字段旁边 - 将使用Access(FIELD)。如果将它放在访问者旁边 - 将使用Access(PROPERTY)。
因此,如果使用Access(FIELD),则不必为特定字段使用适当的JavaBeans样式访问器。您可以拥有一个名为"myField"的私有字段和一个名为"public setBlahBlah( - )"的公共setter。 JPA将仅保留'myField'。
尝试
@Column(updatable = false)
来自javadoc:
Whether the column is included in SQL UPDATE statements generated by
the persistence provider.
您可以使用@Entity(mutable=false)或@Immutable注释为框架标记实体,以便在缓存等方面利用此事实来提高性能。 (休眠)
然后你可以使用这样的不可变包装类:
public class ImmutableStuff {
private final FooField barValue;
public ImmutableStuff(Stuff stuff) {
barValue = stuff.barValue;
}
public FooField getBarValue(){
return barValue;
}
}