java - 使用实体的基类是个好主意吗?

标签 java hibernate

我读到this article 关于 hibernate 实体的基类。

如今,对 id、version、create_at、create_by 等常见字段使用基类是个好主意吗?

哈希码和 equals 方法怎么样?我不喜欢在 equals 方法中使用 id 字段。

是否可以通过组合来解决这个问题? 有什么缺点?

最佳答案

虽然使用实体基类有很多用途,但为了映射公共(public)字段,我宁愿通过嵌入来实现:

  1. 用您的公共(public)字段定义一个类并将其标记为 @Embeddable .
  2. 在包含实体中,添加对“embeddable”类的引用,并将该引用标记为 @Embedded@EmbeddedId ,无论适用。
  3. 如果适用,请在引用文献中添加 @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/

相关文章:

java - 在类中添加 Intent

java - 如何使用 Java 泛型将 "T"参数作为方法参数传递?

java - 从对象中删除属性

java - "No session or session was closed"与 hibernate + RMI

java - @PostConstruct 与 Jersey 1.17、Weblogic 一起使用

java - 如何将 9 位整数解码为随机 4 位数字

java - jmeter:如何在java代码中设置现有jmx文件的线程数?

java - 如何在Eclipse中调试外部插件?

mysql - 有没有办法覆盖 @FetchProfile 中的 @LazyCollection(LazyCollectionOption.FALSE) 设置

java - Spring测试不将数据存储在数据库中