支持最终字段的Java持久性提供程序

nae*_*n84 8 java persistence

我是Java的新手,但我一直在养成使用final的习惯,尽可能宣布不变性,我认为这是一件好事.(考虑f#)

我已经读过JPA不支持final字段.Hibernate,TopLink?我不确定这些,但我现在更喜欢JPA.

这在理论上是否可能 - 让我们通过反思说 - 在创建后修改最终字段?我的猜测是......不...

持久性解决方案当然可以支持带参数的构造函数.至少我认为没有理由会让这件事变得不可能.我猜,映射会有点棘手.这是一种替代解决方案.

建议?

编辑:我不熟悉不可变的确切定义,所以我直观地在这篇文章中使用它.在此声明不变性意味着声明无法更改字段.很抱歉对于这个误会.

小智 6

对象不变性(注意不可变对象之间的区别,并声明一个字段final - 如果所有字段都是final,则对象只是不可变的,因此对象的状态在创建后不能更改)是一个非常敏感的主题.我自己喜欢它们,而hibernate通过@Immutable支持它们.

不知道它在JPA 2中的状态,但回答有关最终字段的问题:您可以使用反射更改其值 - 但在Java EE环境中反射受到严重限制.

为了启发主要问题:如果您的POJO是不可变的,那么持久解决方案将如何重新创建对象?假设你有两个最终的int字段,以及一个初始化它们的构造函数.持久层不能包含有关其顺序或其名称的任何信息(因为在编译期间将删除字段和参数名称).

Koshuke发布了一篇关于此的博客(关于支持不可变bean的JAXB),但现在找不到它.