我对 Java 很陌生,但我已经养成了尽可能使用 Final 声明不变性的习惯,我认为这是一件好事。 (考虑 f#)
我读到 JPA 不支持最终字段。休眠、TopLink?我不确定这些,但我现在更喜欢 JPA。
从理论上讲,是否有可能(比如说通过反射)在创建后修改最终字段?我的猜测是......不:)
对于持久性解决方案来说,当然可能的是支持带参数的构造函数。至少我认为没有理由使这成为不可能。我想映射会有点棘手。
这是一个替代解决方案。
建议?
EDIT:我不熟悉不可变的确切定义,所以我在这篇文章中直观地使用了它。这里声明不可变性意味着声明一个字段不能被改变。很抱歉对于这个误会。
对象不变性(注意不可变对象和声明字段为final之间的区别——只有所有字段都是final的,对象才是不可变的,因此对象的状态在创建后不能改变)是一个非常敏感的话题。我自己很喜欢它们,hibernate 通过 @Immutable 支持它们。
不知道它在 JPA 2 中的状态,但回答有关最终字段的问题:您可以使用反射更改它们的值 - 但反射在 Java EE 环境中受到严重限制。
为了阐明主要问题:如果您的 POJO 是不可变的,那么持久性解决方案将如何重新创建对象?假设您有两个 Final int 字段,以及一个用于初始化它们的构造函数。持久层不能有任何关于它们的顺序或名称的信息(因为字段和参数名称在编译过程中被删除)。
Koshuke 发布了一篇关于此的博客(与支持不可变 bean 的 JAXB 相关),但现在找不到它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)