继承映射策略

一个类继承结构一个表的策略,最终只生成一个表,这是继承映射的默认策略。

举例

如果实体类Teacher继承实体类Person,实体类Student也继承自实体Person,那么只会映射成一个表,这个表中包括了实体类Person、Teacher、Student中所有的字段

这种策略中,一个继承结构中的所有类都被映射到一个表中。该表中有一列被当作“discriminator列”,即使用该列来识别某行数据属于某个指定的子类实例。

这种映射策略对实体和涉及类继承结构的查询的多态系统提供了很好的支持。但缺点是要求与子类的指定状态对应的列可以为空。

配置

JPA使用一个叫做“discriminator列”来区分某一行数据是应该映射成哪个实体。

注解为:@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

ddl语句

  1. CREATE TABLE `t_person` (
  2. `type` varchar(31) NOT NULL,
  3. `id` bigint(20) NOT NULL AUTO_INCREMENT,
  4. `name` varchar(255) DEFAULT NULL,
  5. `school` varchar(255) DEFAULT NULL,
  6. `address` varchar(255) DEFAULT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

保存后的数据

Person

  1. package com.jege.jpa.extend;
  2. import javax.persistence.DiscriminatorColumn;
  3. import javax.persistence.DiscriminatorValue;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.Id;
  7. import javax.persistence.Inheritance;
  8. import javax.persistence.InheritanceType;
  9. import javax.persistence.Table;
  10. /**
  11. * @author JE哥
  12. * @email 1272434821@qq.com
  13. * @description:父类
  14. */
  15. @Entity
  16. @Table(name = "t_person")
  17. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
  18. @DiscriminatorColumn(name = "type")
  19. @DiscriminatorValue("1")
  20. public class Person {
  21. @Id
  22. @GeneratedValue
  23. private Long id;
  24. private String name;
  25. public Long getId() {
  26. return id;
  27. }
  28. public void setId(Long id) {
  29. this.id = id;
  30. }
  31. public String getName() {
  32. return name;
  33. }
  34. public void setName(String name) {
  35. this.name = name;
  36. }
  37. }

Teacher

  1. package com.jege.jpa.extend;
  2. import javax.persistence.DiscriminatorValue;
  3. import javax.persistence.Entity;
  4. import javax.persistence.Table;
  5. /**
  6. * @author JE哥
  7. * @email 1272434821@qq.com
  8. * @description:子类
  9. */
  10. @Entity
  11. @Table(name = "t_teacher")
  12. @DiscriminatorValue("2")
  13. public class Teacher extends Person {
  14. private String address;
  15. public String getAddress() {
  16. return address;
  17. }
  18. public void setAddress(String address) {
  19. this.address = address;
  20. }
  21. }

Student

  1. package com.jege.jpa.extend;
  2. import javax.persistence.DiscriminatorValue;
  3. import javax.persistence.Entity;
  4. import javax.persistence.Table;
  5. /**
  6. * @author JE哥
  7. * @email 1272434821@qq.com
  8. * @description:子类
  9. */
  10. @Entity
  11. @Table(name = "t_student")
  12. @DiscriminatorValue("3")
  13. public class Student extends Person {
  14. private String school;
  15. public String getSchool() {
  16. return school;
  17. }
  18. public void setSchool(String school) {
  19. this.school = school;
  20. }
  21. }

MainTest

  1. package com.jege.jpa.extend;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.EntityManagerFactory;
  4. import javax.persistence.Persistence;
  5. import org.junit.After;
  6. import org.junit.AfterClass;
  7. import org.junit.Before;
  8. import org.junit.BeforeClass;
  9. import org.junit.Test;
  10. /**
  11. * @author JE哥
  12. * @email 1272434821@qq.com
  13. * @description:继承测试
  14. */
  15. public class MainTest {
  16. private static EntityManagerFactory entityManagerFactory = null;
  17. private EntityManager entityManager = null;
  18. @BeforeClass
  19. public static void setUpBeforeClass() throws Exception {
  20. entityManagerFactory = Persistence.createEntityManagerFactory("com.jege.jpa");
  21. }
  22. @Before
  23. public void setUp() throws Exception {
  24. entityManager = entityManagerFactory.createEntityManager();
  25. }
  26. @Test
  27. public void persist() {
  28. Person person = new Person();
  29. person.setName("jege");
  30. Teacher teacher = new Teacher();
  31. teacher.setName("仓老师");
  32. teacher.setAddress("北京");
  33. Student student = new Student();
  34. student.setName("机械师");
  35. student.setSchool("上海");
  36. entityManager.getTransaction().begin();
  37. entityManager.persist(student);
  38. entityManager.persist(teacher);
  39. entityManager.persist(person);
  40. entityManager.getTransaction().commit();
  41. }
  42. @Test
  43. public void find() {
  44. persist();
  45. entityManager.clear();
  46. Student student = entityManager.find(Student.class, 1L);
  47. System.out.println(student.getSchool());
  48. }
  49. @After
  50. public void tearDown() throws Exception {
  51. if (entityManager != null && entityManager.isOpen())
  52. entityManager.close();
  53. }
  54. @AfterClass
  55. public static void tearDownAfterClass() throws Exception {
  56. if (entityManagerFactory != null && entityManagerFactory.isOpen())
  57. entityManagerFactory.close();
  58. }
  59. }

源码地址

https://github.com/je-ge/jpa

如果觉得我的文章对您有帮助,请打赏支持。您的支持将鼓励我继续创作!谢谢!



JPA 系列教程15-继承-一个表-SINGLE_TABLE的更多相关文章

  1. JPA 菜鸟教程 15 继承-一个表-SINGLE_TABLE

    原地址:http://blog.csdn.net/JE_GE/article/details/53678422 继承映射策略 一个类继承结构一个表的策略,最终只生成一个表,这是继承映射的默认策略. 举 ...

  2. JPA 系列教程17-继承-独立表-TABLE_PER_CLASS

    PerTable策略 每个具体的类一个表的策略 举例 这种映射策略每个类都会映射成一个单独的表,类的所有属性,包括继承的属性都会映射成表的列. 这种映射策略的缺点是:对多态关系的支持有限,当查询涉及到 ...

  3. JPA 系列教程16-继承-联合子类-JOINED

    联合子类策略 这种情况下子类的字段被映射到各自的表中,这些字段包括父类中的字段,并执行一个join操作来实例化子类. 举例 如果实体类Teacher继承实体类Person,实体类Student也继承自 ...

  4. JPA 系列教程10-双向一对一关联表

    双向一对一关联表的ddl语句 CREATE TABLE `t_person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255 ...

  5. JPA 系列教程2-单表操作

    JPA Sun官方提出的Java持久化规范.它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据.他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在Hibe ...

  6. JPA 系列教程5-双向一对多

    双向一对多的ddl语句 同单向多对一,单向一对多表的ddl语句一致 Product package com.jege.jpa.one2many; import javax.persistence.En ...

  7. JPA 系列教程4-单向一对多

    JPA中的@OneToMany @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface OneToMany { Class tar ...

  8. JPA 系列教程3-单向多对一

    JPA中的@ManyToOne 主要属性 - name(必需): 设定"many"方所包含的"one"方所对应的持久化类的属性名 - column(可选): 设 ...

  9. JPA 系列教程21-JPA2.0-@MapKeyColumn

    @MapKeyColumn 用@JoinColumn注解和@MapKeyColumn处理一对多关系 ddl语句 CREATE TABLE `t_employee` ( `id` bigint(20) ...

随机推荐

  1. Excel的 OleDb 连接串的格式(Provider=Microsoft.ACE.OLEDB)

    string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;data source=" + filePath + ";Exten ...

  2. 批处理改hosts

    @echo off color 0F @attrib -r "%windir%\system32\drivers\etc\hosts" @echo ######测试配置 beg & ...

  3. C++知识体系

    基础知识 推荐书目 C++ <C++程序设计>(课程教材即可,简而薄) <STL源码剖析>(对C++进一步深化,也是必备知识) <C++对象模型>(经典中经典,重点 ...

  4. django 安装记录

    1. 下载django安装包,下载个最新的安装包即可. https://www.djangoproject.com/download/ 2. 在本地解压   tar -xvf  安装包名称 3. 安装 ...

  5. wefwewewe

    <a hred="https://www.baidu.com">dssf</a>

  6. Mac下MySQL的安装与配置

    之前一直用的是阿里云的服务器,在服务器上装了一个MySQL,但是今天发现到期了,而且续费时发现之前的大学生优惠不能用了,可是明明到6月份,大学生才毕业啊,shit!!!所以没办法只能在自己电脑上装一个 ...

  7. YII2.0 数据库增删改查

    /*==================== dkhBaseModel 数据库增删改查方法 start ================================*/ //新增一条数据 publ ...

  8. 架设自己的FTP服务器 Serv-U详细配置图文教程

    转自:http://www.jb51.net/article/31635.htm 所有不是很要求安全的情况下是可以用serv_U的,当然我们也可以通过一些设置,保证serv_u安全运行.这里就分享下s ...

  9. [妙味JS基础]第十课:日期对象、时钟倒计时

    知识点总结 时间.年.月.日.时.分.秒 new Date() ->当前系统的时间对象 数字类型: getFullYear().getYear().getUTCFullYear() getYea ...

  10. ubuntu下pip install mysql-python 失败的解决方案

    ubuntu连接mysql 需要安装mysql-python 出现can not find mysql-config 文件错误 先安装 sudo apt-get install libmysqld-d ...