我读到this article 关于 hibernate 实体的基类。
如今,对 id、version、create_at、create_by 等常见字段使用基类是个好主意吗?
哈希码和 equals 方法怎么样?我不喜欢在 equals 方法中使用 id 字段。
是否可以通过组合来解决这个问题? 有什么缺点?
最佳答案
虽然使用实体基类有很多用途,但为了映射公共(public)字段,我宁愿通过嵌入来实现:
- 用您的公共(public)字段定义一个类并将其标记为
@Embeddable
. - 在包含实体中,添加对“embeddable”类的引用,并将该引用标记为
@Embedded
或@EmbeddedId
,无论适用。 - 如果适用,请在引用文献中添加 @AttributeOverrides 标记或
@AssociationOverrides
自定义映射。
我在 @MappedSuperclass
中看到的主要问题(链接帖子中使用的方法)是每个实体只能有一个父类(super class)。这在许多用例中可能没问题,但对于最复杂的用例来说就太不灵活了。嵌入使您可以灵活地组合任意数量的 @Embeddable
。代价是它不透明。如果您有:
select u.streetname from User u
并将streetname
移动到嵌入的地址
,现在您必须执行以下操作:
select u.address.streetname from User u
最后,如果您知道您的模型很简单,@MappedSuperclass
就可以解决问题。如果您有一个复杂的模型,您可以从 @Embeddable
和 @Embedded
中受益。
关于java - 使用实体的基类是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25867169/