在每个类创建一张表的情况下, 表中不使用Null值的列。 这种方法的缺点是在子类表中创建了重复的列。

在这里,我们需要在父类中使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)注释,并在子类中使用@AttributeOverrides注释。
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)指定正在使用每个具体类策略的表。它应该仅在父类中指定。

@AttributeOverrides定义该类中的父类属性将被覆盖。 在表结构中,父类表列将被添加到子类表中。

我们来了解映射的层次结构。

在每个具体类一张表的情况下,数据库中将有三个表,每个表表示一个特定的类。

每个表的格结构如下:
Employee类的表结构 -

  1. CREATE TABLE `emp122` (
  2. `id` int(11) NOT NULL,
  3. `name` varchar(255) DEFAULT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL

Regular_Employee类的表结构 -

  1. CREATE TABLE `regemp122` (
  2. `id` int(11) NOT NULL,
  3. `name` varchar(255) DEFAULT NULL,
  4. `salary` float DEFAULT NULL,
  5. `bonus` int(11) DEFAULT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL

Contract_Employee类的表结构 -

  1. CREATE TABLE `contemp122` (
  2. `id` int(11) NOT NULL,
  3. `name` varchar(255) DEFAULT NULL,
  4. `pay_per_hour` float DEFAULT NULL,
  5. `contract_duration` varchar(255) DEFAULT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SQL

每个具体类的表示例

在这个例子中,我们创建了三个类,并在employee.hbm.xml文件中提供了这些类的映射。创建一个项目:inheritance2annotation, 完整的项目结构如下 -

1)创建持久类

您需要创建表示继承的持久化类。 让我们为上面的层次结构创建三个类:

文件:Employee.java

  1. package com.yiibai;
  2. import javax.persistence.*;
  3. import javax.persistence.*;
  4. @Entity
  5. @Table(name = "employee102")
  6. @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
  7. public class Employee {
  8. @Id
  9. @GeneratedValue(strategy = GenerationType.AUTO)
  10. @Column(name = "id")
  11. private int id;
  12. @Column(name = "name")
  13. private String name;
  14. public int getId() {
  15. return id;
  16. }
  17. public void setId(int id) {
  18. this.id = id;
  19. }
  20. public String getName() {
  21. return name;
  22. }
  23. public void setName(String name) {
  24. this.name = name;
  25. }
  26. // setters and getters
  27. }
Java

文件:Regular_Employee.java

  1. package com.yiibai;
  2. /**
  3. *
  4. * @author by maxsu
  5. * @copyright http://www.yiibai.com
  6. * @link download at: http://www.yiibai.com/siteinfo/download.html
  7. */
  8. import javax.persistence.*;
  9. @Entity
  10. @Table(name = "regularemployee102")
  11. @AttributeOverrides({
  12. @AttributeOverride(name = "id", column = @Column(name = "id")),
  13. @AttributeOverride(name = "name", column = @Column(name = "name")) })
  14. public class Regular_Employee extends Employee {
  15. @Column(name = "salary")
  16. private float salary;
  17. @Column(name = "bonus")
  18. private int bonus;
  19. public float getSalary() {
  20. return salary;
  21. }
  22. public void setSalary(float salary) {
  23. this.salary = salary;
  24. }
  25. public int getBonus() {
  26. return bonus;
  27. }
  28. public void setBonus(int bonus) {
  29. this.bonus = bonus;
  30. }
  31. // setters and getters
  32. }
Java

文件:Contract_Employee.java

  1. package com.yiibai;
  2. /**
  3. *
  4. * @author by maxsu
  5. * @copyright http://www.yiibai.com
  6. * @link download at: http://www.yiibai.com/siteinfo/download.html
  7. */
  8. import javax.persistence.*;
  9. @Entity
  10. @Table(name = "contractemployee102")
  11. @AttributeOverrides({
  12. @AttributeOverride(name = "id", column = @Column(name = "id")),
  13. @AttributeOverride(name = "name", column = @Column(name = "name")) })
  14. public class Contract_Employee extends Employee {
  15. @Column(name = "pay_per_hour")
  16. private float pay_per_hour;
  17. @Column(name = "contract_duration")
  18. private String contract_duration;
  19. public float getPay_per_hour() {
  20. return pay_per_hour;
  21. }
  22. public void setPay_per_hour(float payPerHour) {
  23. pay_per_hour = payPerHour;
  24. }
  25. public String getContract_duration() {
  26. return contract_duration;
  27. }
  28. public void setContract_duration(String contractDuration) {
  29. contract_duration = contractDuration;
  30. }
  31. }
Java

2)在配置文件中添加hbm文件的映射

打开hibernate.cfg.xml文件,并添加如下映射资源的项:

  1. <mapping class="com.yiibai.Employee" />
  2. <mapping class="com.yiibai.Contract_Employee" />
  3. <mapping class="com.yiibai.Regular_Employee" />
XML

现在配置文件将如下所示:

文件:hibernate.cfg.xml

  1. <?xml version='1.0' encoding='UTF-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  5. <!-- Generated by MyEclipse Hibernate Tools. -->
  6. <hibernate-configuration>
  7. <session-factory>
  8. <property name="hbm2ddl.auto">update</property>
  9. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  10. <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
  11. <property name="connection.username">root</property>
  12. <property name="connection.password">123456</property>
  13. <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  14. <property name="show_sql">true</property>
  15. <mapping class="com.yiibai.Employee" />
  16. <mapping class="com.yiibai.Contract_Employee" />
  17. <mapping class="com.yiibai.Regular_Employee" />
  18. </session-factory>
  19. </hibernate-configuration>
XML

hbm2ddl.auto属性定义是用于在数据库中创建自动表。

4)创建存储持久对象的类

在这个类中,我们只是将Employee 对象存储在数据库表中。

文件:MainTest.java

  1. package com.yiibai;
  2. import org.hibernate.*;
  3. import org.hibernate.boot.MetadataSources;
  4. import org.hibernate.boot.registry.StandardServiceRegistry;
  5. import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
  6. /**
  7. *
  8. * @author by maxsu
  9. * @copyright http://www.yiibai.com
  10. * @link download at: http://www.yiibai.com/siteinfo/download.html
  11. */
  12. public class MainTest {
  13. public static void main(String[] args) {
  14. // 但在5.1.0版本汇总,hibernate则采用如下新方式获取:
  15. // 1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final
  16. // 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件
  17. final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
  18. .configure("hibernate.cfg.xml").build();
  19. // 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂
  20. SessionFactory sessionFactory = new MetadataSources(registry)
  21. .buildMetadata().buildSessionFactory();
  22. /**** 上面是配置准备,下面开始我们的数据库操作 ******/
  23. Session session = sessionFactory.openSession();// 从会话工厂获取一个session
  24. // creating transaction object
  25. Transaction t = session.beginTransaction();
  26. Employee e1 = new Employee();
  27. e1.setName("用户名-01");
  28. Regular_Employee e2 = new Regular_Employee();
  29. e2.setName("yiibai su");
  30. e2.setSalary(50002);
  31. e2.setBonus(5);
  32. Contract_Employee e3 = new Contract_Employee();
  33. e3.setName("Mina su");
  34. e3.setPay_per_hour(1010);
  35. e3.setContract_duration("15 hours");
  36. session.persist(e1);
  37. session.persist(e2);
  38. session.persist(e3);
  39. t.commit();
  40. session.close();
  41. System.out.println("success");
  42. }
  43. }
Java

执行上面代码运行测试即可,应该会自动创建三张表,并插入数据。

Hibernate每个具体类一张表映射(使用注释)的更多相关文章

  1. Hibernate每个具体类一张表映射(使用XML)

    在每个具体类一个表中,数据库中将有三个表但彼此之间没有关系(关联). 根据具体类策略将表格映射到表有两种方法. 由union-subclass元素指定 通过自我为每个类创建表 我们来了解映射的层次结构 ...

  2. Hibernate每个层次类一张表(使用注释)

    在上一文章中,我们使用xml文件将继承层次映射到一个表. 在这里,我们将使用注释来执行同样的任务.需要使用@Inheritance(strategy = InheritanceType.SINGLE_ ...

  3. 03HibernateJAVA类与数据库表映射配置

    HibernateJAVA类与数据库表映射配置

  4. Hibernate每个子类一张表(使用注释)实例

    在每个子类一张表的情况下,表是根据持久类创建的,但是它们使用主键和外键来重新定义. 所以关系中不会有重复的列. 我们需要在子类中的使用@PrimaryKeyJoinColumn注释和在父类指定@Inh ...

  5. 配置hibernate根据实体类自动建表功能

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...

  6. 【原创】Hibernate通过实体类自动建表时type=MyISAM的问题

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 当使用的mysql数据库为5.5版本时,方言需要设置为 <property name="hibernate.dialect&q ...

  7. Hibernate根据实体类自动创建表

    Hibernate支持自动建表,在开发阶段很方便,可以保证hbm与数据库表结构的自动同步. 如何使用呢?很简单,只要在hibernate.cfg.xml里加上如下代码 Xml代码<propert ...

  8. 通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件

    通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件   文章目录 Ja ...

  9. Hibernate使用xml文件的每个类层次一张表

    通过这种继承策略,我们可以通过单表映射整个层次结构. 这里,在表中创建一个额外的列(也称为discriminator列)来标识该类. 让我们先了解问题.下面给出的整个层次类映射到数据库的一个表中图解说 ...

随机推荐

  1. npm依赖管理:冗余,依赖树

    npm的依赖树查询:原理都是查询文件夹node_modules的结构.比如mac的node_modules位置在/usr/local/lib下.具体项目的node_modules位置位于项目根目录下. ...

  2. openstack学习笔记(一)-openstack的基础知识

    一.OpenStack的基础知识 openstack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache2.0许可证(兼容GPLv3以及DFSG)授权的自由软件和 ...

  3. javascript快速入门27--XSLT基础

    XSL 与 XSLT XSL 指扩展样式表语言(EXtensible Stylesheet Language).它主要被用来对XML文档进行格式化,与CSS不同,XSL不仅仅是样式表语言XSL主要包括 ...

  4. 深入理解Hadoop集群和网络【转】

    http://os.51cto.com/art/201211/364374.htm 本文将着重于讨论Hadoop集群的体系结构和方法,及它如何与网络和服务器基础设施的关系.最开始我们先学习一下Hado ...

  5. Hadoop之Azkaban详解

    工作流调度器azkaban1 为什么需要工作流调度系统 1)一个完整的数据分析系统通常都是由大量任务单元组成:shell脚本程序,java程序,mapreduce程序.hive脚本等 2)各任务单元之 ...

  6. 推荐一个静态页面生成工具-mkdocs

    最近需要找一个生成api文档的工具,找来找去发现mkdocs特别符合需求. 部署只需python和pip 直接生成静态html 用markdown编写 不需要再markdown里指明日期.标题等信息 ...

  7. npm添加淘宝镜像

    原文:http://cnodejs.org/topic/4f9904f9407edba21468f31e npm是一个很好用的工具,全场是Node Packet Manager,是一个nodejs的包 ...

  8. Java ActiveMQ队列模式案例

    创建Eclipse项目并运行 创建java project:ActiveMQ-5.14,新建lib文件夹 打开apache-activemq-5.14.0-bin\apache-activemq-5. ...

  9. 【android相关】【问题解决】R.java文件丢失

    在进行android开发过程中,有时候,我们会遇到gen文件中R.java丢失的现象.重新build,或者clean工程,close并重新打开Project,但有时也没解决. 这可能是由于不小心把xm ...

  10. 【VBA编程】15.WorkSheet对象常用属性

    [Cells属性] Cells属性用于返回一个Range对象,表示工作表中所有的单元格,包括已经使用的单元格和未使用的单元格. [代码区域] Sub 使用Cells属性() '声明变量 Dim wk ...