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

标签 java persistence

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

我了解到 JPA 不支持 final 字段。 hibernate ,TopLink?我不确定这些,但我现在更喜欢 JPA。

这在理论上是否有可能 - 让我们通过反射(reflection)来说 - 在创建后修改 final 字段?我的猜测是……不 :)

对于持久性解决方案来说,当然可能的是支持带参数的构造函数。至少我认为没有理由使这成为不可能。我猜映射会有点棘手。 这是一个替代解决方案。

建议?

编辑: 我不熟悉不可变的确切定义,所以我凭直觉在这篇文章中使用了它。在这里声明 Immutability 意味着声明一个字段不能被改变。抱歉造成误会。

最佳答案

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

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

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

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

关于java - 支持最终字段的 Java 持久性提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2455906/

相关文章:

java - 打开模拟器时出现很多错误。如何修复这些错误?

java - 尝试更改 android 中 if else 语句中的 int 值时遇到问题

java - 有人可以在曼哈顿距离中为我解释一下 Java 中的 8 谜题吗?

java - 创建具有两个互斥字段的实体

serialization - EJB。当我使用 var List 调用 session Bean 时,抛出 : this javax. ejb.EJBException : java. rmi.MarshalException

java - 如何使用 RxJava 发出错误然后发出缓存数据?

java - 使用 Spring Autowiring 嵌入式弹性件

java - JDO/Datanucleus 错误 : Field "..." is declared as a reference type (interface/Object) but no implementation classes of "..." have been found?

java - @PersistenceUnit 注释不会创建 EntityManageFactory emf=null

mysql - Spring JPA不存储实体