【问题标题】:Are there any drawbacks to marking a @id JPA annotated property as final?将@id JPA 注释属性标记为最终属性有什么缺点吗?
【发布时间】:2017-10-20 22:34:48
【问题描述】:

很多JPA实体演示类都有以下sn-ps:

 @Id
 private Long id;

任何人都可以看到将id 属性始终标记为最终属性的任何缺点吗?

 @Id
 private final Long id;

似乎我们几乎总是希望这样做以保留实体身份。

【问题讨论】:

  • 因为这样就没有办法持久化实体了?
  • 这是一个很好的理由:)

标签: java hibernate jpa orm


【解决方案1】:

简答

这使得使用 JPA 类变得不可能。

细化

final 是 Java 关键字,而不是框架关键字。 Java 不关心 JPA 实体的契约是什么。您不能声明未初始化的 final 字段,因为按照约定,final 字段只能写入一次。

另外,ID 属性不是不可变的。对于初学者来说,当一个对象被序列化时,它们会发生变化——一个空 ID 被一个生成的 ID 替换。更简单的是,当从数据库中删除一个实体时,它的 ID 将被取消。

【讨论】:

  • 嗯 - 最初我认为它可以在构造函数中初始化(所以没有数据库分配键) - 但 IIUC JPA 需要一个空的构造函数,因此在构造过程中无法初始化该字段对吗?
  • 是的,而且这通常不是您使用 JPA 持久化对象的方式。您首先填写实体,然后将其持久化(从而给它一个数据库 ID)。 JPA 实体可以像 POJO 一样在非持久状态下完美地存在。
  • True - 试图找出最快最简单的方法来实现 equals 和 hashcode - 如果我们可以预先分配主键并且永远不会改变它 - 那么我们可以基于它的 equals 和 hashcode - 询问它早先用于 Kotlin - stackoverflow.com/questions/46838256/… - Lombok 在这个空间中也有注释。
  • 所以基本上缺点是它使得使用 JPA 类变得不可能:) ?
  • 简而言之,是的:>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多