我在 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/