mysql - Hibernate 注释和继承

标签 mysql hibernate jboss7.x hibernate-annotations

我在 MySQL 数据库中有多个表。假设它们看起来像这样:

  • 书:

    title, subject, publisher, book_author
    
  • 期刊:

    title, subject, publisher, journal_name
    
  • 博客:

    title, subject, website, blog_author
    
  • 电子新闻:

    title, subject, website, news_paper_name
    

具体结构与问题无关。实际上,大约有 20 列是所有表共享的,还有更多列是少数或一个表所独有的。关键是,它们都共享一些专栏。我想使用 Hibernate 来访问这些,使用带注释的类。我不想有 5 个以上的类,每个类都有 20 个以上的冗余字段,每个都有一个访问器和修改器。我想要一个像这样的类结构:

  • 摘要 出版物 { 标题,主题 }
    • 摘要 PrintPublication { 出版商 }
      • Book { book_author }
      • 期刊 { journal_name }
    • 摘要 在线发布 { 网站 }
      • 博客 { blog_author }
      • 电子新闻 { news_paper_name }

但是,我终究无法弄清楚如何让它发挥作用。每个具体类都是数据库中的一个表。我认为解决方案是每个类一个表 (@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)),但这引发了许多有趣的错误。

所有这些问题的正确解决方案是什么?除了改变表结构。该数据库不是我的,我无权更改它。

最佳答案

如果不需要实体之间的类型继承,为此有 MappedSuperClass .想法是您定义所有公共(public)持久属性,它们在映射父类(super class)和实体中的映射将扩展它。

结果是映射将应用于扩展映射父类(super class)的实体,但从持久性的角度来看,实体和映射父类(super class)之间不存在关系。

以下提供起点:

@MappedSuperclass
public class Publication {
    String title;
    @Column (name="subject_of_publication")
    String subject;

    ...
}

@MappedSuperclass
public class PrintPublication extends Publication {
    String publisher;
    ...
}

@Entity
public class Book extends PrintPublication {//inherits persistent attributes
    ...
    String author;
}

您还可以在实体层次结构的其他级别映射父类(super class),并根据需要覆盖实体中的映射。

但是如果您必须在某些方面威胁例如 Book 和 Blog 作为一种类型,那么映射父类(super class)就不行了,因为您无法查询它。

关于mysql - Hibernate 注释和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057656/

相关文章:

PHP 页面在第一次单击按钮时未加载生成的值?

hibernate - 在一对多 Hibernate 映射中使用部分复合键

mysql - 在 Mysql 中加入 HQL 更新的替代方法

spring - 如何在不触及每个 JSP 文件的情况下为所有 JSP 设置 pageEncoding?

mysql - SQL元表帮助(mysql)

java - 使用数据库创建新对象

java - 通过代码计算 jBoss AS7 session 数

java - JAAS - Java EE 6 中的 Java 编程安全性(没有 @DeclareRoles)

php - 如何使 mysql 搜索允许两个单独的搜索类别?

java - Hibernate Envers - 不为 createQuery(...).executeUpdate() 编写审计记录,只为 .persist() 和 .merge()