【问题标题】:Hibernate Annotations & InheritanceHibernate注解和继承
【发布时间】:2012-06-15 20:18:38
【问题描述】:

我在 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 多个冗余字段,每个都有一个访问器和修改器。我想要一个类似这样的类结构:

  • 摘要 Publication { 标题,主题 }
    • 摘要 PrintPublication { 发布者 }
      • Book { book_author }
      • Journal { 期刊名称 }
    • 摘要 Online Publicaiton { 网站 }
      • Blog { blog_author }
      • ENews { news_paper_name }

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

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

【问题讨论】:

    标签: mysql hibernate jboss7.x hibernate-annotations


    【解决方案1】:

    如果实体之间不需要类型继承,则有MappedSuperClass。想法是您在映射的超类中定义所有常见的持久属性及其映射,实体将扩展它。

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

    以下提供起点:

    @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;
    }
    

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

    但是,如果您必须在某些方面受到威胁,例如 Book 和 Blog 作为一种类型,那么映射超类不是可行的方法,因为您无法查询它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      相关资源
      最近更新 更多