在我们的应用程序中,我们需要只能分配一次的字段 .
起初我们考虑封装字段并使setter私有化 . 但是,有些问题会引起:
如果没有公共设置器,Hibernate是否仍能从数据库中映射字段?
我可以剥离setter并仅在实体构造函数中使字段可变吗?
最后,是否有任何标准的JPA方法使字段不可变?
提前致谢 .
广告1:我认为如果注释放在字段上而不是放在getter上,JPA会使用普通的私有字段进行读取和写入 . 最近我发现Hibernate作为底层JPA提供者根本不需要 get*() 和 set*() 方法 . 这是一个真正具有启发性的解决方案,因为从一开始我就认为Hibernate需要访问器 . 所以答案是: you don't need setters 就Hibernate而言 .
get*()
set*()
广告2:但是请注意,Hibernate仍然需要no-arg构造函数,否则它将无法加载具有描述性异常的实体 . 这也是JPA的要求 .
广告3:不,没有 . 请记住,您的馆藏也必须是不可变的 .
尝试
@Column(updatable = false)
并使你的二传手私人 . (如果你愿意,可以公开你的获取者)
我认为这是最好的做法 .
P.S . :JPA使用字段访问,如果您注释您的字段并使用getter / setter访问,如果您注释您的getter方法 .
在JPA 2.0中,您有两种方法可以定义应该保留哪些属性:
Access(FIELD) - 字段名称是持久的,
Access(PROPERTY) - 属性名称是持久的 .
如果没有使用Access( - )注释,则决定使用哪种访问权限取决于您放置@Id注释的位置 . 如果将它放在您的字段旁边 - 将使用Access(FIELD) . 如果将它放在访问者旁边 - 将使用Access(PROPERTY) .
因此,如果使用Access(FIELD),则不必为特定字段提供适当的JavaBeans样式访问器 . 您可以拥有一个名为“myField”的私有字段和一个名为“public setBlahBlah( - )”的公共setter . JPA将仅保留'myField' .
来自javadoc:
该列是否包含在由持久性提供程序生成的SQL UPDATE语句中 .
您可以使用 @Entity(mutable=false) 或 @Immutable 注释为框架标记实体,以利用此事实来提高缓存等性能 . (休眠)
@Entity(mutable=false)
@Immutable
然后你可以使用这样的不可变包装类:
public class ImmutableStuff { private final FooField barValue; public ImmutableStuff(Stuff stuff) { barValue = stuff.barValue; } public FooField getBarValue(){ return barValue; } }
5 回答
广告1:我认为如果注释放在字段上而不是放在getter上,JPA会使用普通的私有字段进行读取和写入 . 最近我发现Hibernate作为底层JPA提供者根本不需要
get*()
和set*()
方法 . 这是一个真正具有启发性的解决方案,因为从一开始我就认为Hibernate需要访问器 . 所以答案是: you don't need setters 就Hibernate而言 .广告2:但是请注意,Hibernate仍然需要no-arg构造函数,否则它将无法加载具有描述性异常的实体 . 这也是JPA的要求 .
广告3:不,没有 . 请记住,您的馆藏也必须是不可变的 .
尝试
并使你的二传手私人 . (如果你愿意,可以公开你的获取者)
我认为这是最好的做法 .
P.S . :JPA使用字段访问,如果您注释您的字段并使用getter / setter访问,如果您注释您的getter方法 .
在JPA 2.0中,您有两种方法可以定义应该保留哪些属性:
Access(FIELD) - 字段名称是持久的,
Access(PROPERTY) - 属性名称是持久的 .
如果没有使用Access( - )注释,则决定使用哪种访问权限取决于您放置@Id注释的位置 . 如果将它放在您的字段旁边 - 将使用Access(FIELD) . 如果将它放在访问者旁边 - 将使用Access(PROPERTY) .
因此,如果使用Access(FIELD),则不必为特定字段提供适当的JavaBeans样式访问器 . 您可以拥有一个名为“myField”的私有字段和一个名为“public setBlahBlah( - )”的公共setter . JPA将仅保留'myField' .
尝试
来自javadoc:
您可以使用
@Entity(mutable=false)
或@Immutable
注释为框架标记实体,以利用此事实来提高缓存等性能 . (休眠)然后你可以使用这样的不可变包装类: