Java jpa 字段限制_关于java:Hibernate / JPA中是否可以有不可变字段?

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

起初我们考虑封装字段并使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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值