在本教程中,我们将看到如何在hibernate中实现继承。有3种方法可以在hibernate中实现继承。在本文中,我们将看到其中一种,即每个类层次结构一个表。

休眠中的继承:

Java是面向对象的语言,继承是Java的主要功能之一。关系模型可以实现“是”和“具有”关系,但是休眠为我们提供了以不同方式实现类层次结构的方法。

每个类层次结构一张表:

假设我们具有以下类层次结构,我们以shape类为基类,而Rectangle和Circle继承自Shape类。

在每个类层次结构的一个表中,将为以上层次结构创建一个表。即,将创建具有以下结构的SHAPE表。

如您所见,仅创建了一个具有子类属性的表(SHAPE)。 根据上面的类图,我们将创建三个类-Shape.java,Rectangle.java和Circle.java

1.Shape.java

这是我们实体类层次结构的根类。

在SRC-> org.arpit.javapostsforlearning创建Shape.java。

package org.arpit.javapostsforlearning;
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import javax.persistence.DiscriminatorType;@Entity
@Table(name='SHAPE')
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
(name='Discriminator',discriminatorType=DiscriminatorType.STRING
)
@DiscriminatorValue(value='S')
public class Shape {@Id@GeneratedValue@Column(name='Shape_Id')int shapeId;@Column(name='Shape_Name')String shapeName;public Shape(){} public Shape(String shapeName){this.shapeName=shapeName;}//getters and setters}

Shape是我们的根类,因此一些注释需要与根类一起使用以实现继承。

@遗产:

为了在hiberante中实现继承,使用@Inheritance批注。该批注定义了要为实体类层次结构实现的继承策略。对于每个类层次结构的一个表,我们已使用Single_Table作为继承策略。此批注在根级别或子层次结构级别定义适用不同策略的地方。

@DiscriminatorColumn:

该注释用于定义Single_Table和联接策略的区分符列,用于区分不同的类实例。此注释在要应用不同策略的根级别或子层次结构级别定义。 如果未指定@DiscriminatorColumn批注,则hibernate将创建一个名为“ DType”的列,而DiscriminatorType将为字符串。

@DiscriminatorValue:

这个注解定义了该类在鉴别符列中的值。这只能应用于实体具体类。例如,如果条目将是SHAPE表中的形状实例,则's'将是鉴别符列中该行的值。未指定注释,并且使用Discriminator列,则将提供提供者特定的值,如果Discriminator类型为String,则鉴别符值将是实体名称。Discriminator值,如果没有默认值,则需要在层次结构中的每个实体上指定。

2,Rectangle.java

这是我们的孩子班。

在src-> org.arpit.javapostsforlearning中创建Rectangle.java

package org.arpit.javapostsforlearning;import javax.persistence.Column;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;@Entity
@DiscriminatorValue(value='R')
public class Rectangle extends Shape{@Column(name='Rectangle_Length')int length;@Column(name='Rectangle_Breadth')int breadth;// getters and setterspublic Rectangle(){}public Rectangle(String shapeName,int length,int breadth){super(shapeName);this.length=length;this.breadth=breadth;}// getters and setters
}

3,Circle.java

这是我们的第二个孩子班。

在SRC-> org.arpit.javapostsforlearning创建Circle.java。

package org.arpit.javapostsforlearning;import javax.persistence.Column;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;@Entity
@DiscriminatorValue(value="R")
public class Rectangle extends Shape{@Column(name="Rectangle_Length")int length;@Column(name="Rectangle_Breadth")int breadth;// getters and setterspublic Rectangle(){}public Rectangle(String shapeName,int length,int breadth){super(shapeName);this.length=length;this.breadth=breadth;}// getters and setters
}

4,Hiberante.cfg.xml:

src文件夹中创建一个名为“ hibernate.cfg.xml”的文件。

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC'-//Hibernate/Hibernate Configuration DTD 3.0//EN''http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd'><hibernate-configuration><session-factory><!-- Database connection settings --><property name='connection.driver_class'>com.microsoft.sqlserver.jdbc.SQLServerDriver</property><property name='connection.url'>jdbc:sqlserver://localhost:1433;database=UserInfo</property><property name='connection.username'>sa</property><property name='connection.password'></property><!-- JDBC connection pool (use the built-in) --><property name='connection.pool_size'>1</property><!-- SQL dialect --><property name='dialect'>org.hibernate.dialect.SQLServer2005Dialect</property><!-- Enable Hibernate's automatic session context management --><property name='current_session_context_class'>thread</property><!-- Disable the second-level cache  --><property name='cache.provider_class'>org.hibernate.cache.NoCacheProvider</property><!-- Echo all executed SQL to stdout --><property name='show_sql'>true</property><!-- Drop and re-create the database schema on startup --><property name='hbm2ddl.auto'>create</property><mapping class='org.arpit.javapostsforlearning.Shape'></mapping><mapping class='org.arpit.javapostsforlearning.Rectangle'></mapping><mapping class='org.arpit.javapostsforlearning.Circle'></mapping></session-factory></hibernate-configuration>

5,主要类别

package org.arpit.javapostsforlearning;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;public class HibernateMain {public static void main(String[] args) {Shape shape=new Shape('Sqaure');Rectangle rectangle=new Rectangle('Rectangle', 10, 20);  Circle circle=new Circle('Circle', 4);Configuration configuration=new Configuration();configuration.configure();ServiceRegistry sr= new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();SessionFactory sf=configuration.buildSessionFactory(sr);Session ss=sf.openSession();ss.beginTransaction();ss.save(shape);ss.save(rectangle);ss.save(circle);ss.getTransaction().commit();ss.close();}
}

6,运行它

运行它时,您将获得以下输出。

Hibernate: create table SHAPE (Discriminator varchar(31) not null, Shape_Id int identity not null, Shape_Name varchar(255), Rectangle_Breadth int, Rectangle_Length int, Circle_Radius int, primary key (Shape_Id))
Feb 04, 2013 11:01:36 PM org.hibernate.tool.hbm2ddl.SchemaExport execute
INFO: HHH000230: Schema export complete
Hibernate: insert into SHAPE (Shape_Name, Discriminator) values (?, 'S')
Hibernate: insert into SHAPE (Shape_Name, Rectangle_Breadth, Rectangle_Length, Discriminator) values (?, ?, ?, 'R')
Hibernate: insert into SHAPE (Shape_Name, Circle_Radius, Discriminator) values (?, ?, 'C')

7,SQL输出

数据库中的SHAPE表。

参考: Hibernate继承:我们的JCG合作伙伴 Arpit Mandliya在初学者博客的Java框架和设计模式下的 每个类层次结构表 。

翻译自: https://www.javacodegeeks.com/2013/02/hibernate-inheritance-table-per-class-hierarchy.html

Hibernate继承:每个类层次结构的表相关推荐

  1. hibernate 继承_Hibernate继承:每个类层次结构的表

    hibernate 继承 在本教程中,我们将了解如何在hibernate中实现继承.可以通过3种方式在hibernate中实现继承.在本文中,我们将看到其中一种,即每个类层次结构一个表. Hibern ...

  2. 使用hibernate映射oracle两个表空间的表,Hibernate每个具体类一张表映射(使用XML)

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

  3. hibernate mysql 自动建表_配置hibernate根据实体类自动建表功能

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

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

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

  5. hibernate继承关系映射方法(三)--每个具体类一张表TPC

    TPC:所谓是"每个具体类一张表(table per concrete class)"的意思是:使继承体系中每一个子类都对应数据库中的一张表.每一个子类对应的数据库表都包含了父类的 ...

  6. hibernate继承关系映射方法(一)--共享一张表

    对于如下关系: Person.java package com.hust.PO;public class Person {private Integer id;private String name; ...

  7. Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表

    Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表 <?xml version="1.0"?> <!DOCTYPE hibernate-m ...

  8. BookCollectionSoftware - 图书管理(知识点糅合::类,对象,抽象类,接口,封装,继承,多态,顺序表)- java - 细节狂魔

    文章目录 前言 图书管理应实现的功能 准备工作 开始操作 先在book包,创建一个Book类,用来存储一本书的信息 小技巧: 根据小技巧来创造我们的 构造方法,公开的输入输出的接口,,还要重写的toS ...

  9. web进修之—Hibernate 继承映射(5)

    先看三个类的继承关系,Payment是父类,CashPayment和CreditCardPayment是Payment的子类: view plaincopy to clipboardprint pub ...

最新文章

  1. 你也可以设计简单的内容管理系统
  2. iOS 9音频应用播放音频之控制播放速度
  3. python官网下载步骤64位-windows下载并安装Python的具体步骤
  4. MATLAB的size()函数的返回值是一个1*2的向量哦,即使参数是向量也是1*2的向量哦!
  5. 禁用/启用本地连接的dos命令是什么啊?
  6. 【统计学习方法】决策树
  7. C#应用程序单例并激活程序的窗口 使其显示在最前端
  8. 荣耀手表2鸿蒙,鸿蒙2.0曝光 计划在明年用于手表手环上
  9. 使用JBoss EAP 7的HTTP / 2
  10. apscheduler executors
  11. sklearn 中GBDT的损失函数
  12. 2017.4.16 java 获取当前时间及年月日时分秒
  13. Chrome启动参数最全集合
  14. 使用yq工具合并两个yml文件
  15. Excel表格实现下拉复选框多选
  16. 【傻瓜教程】Ubuntu18.04LTS安装NVIDIA驱动详细完整过程
  17. Oracle间隔(interval)分区
  18. MyBatis基础学习知识点3
  19. android 沙盒_我们分别测试了2020年排名前五的最佳android电视盒
  20. 全国外语水平考试(WSK)

热门文章

  1. 使用log4j2打印mybatis的sql执行日志
  2. jtable隐藏全部_全部隐藏!
  3. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?
  4. selenium架构_Selenium测试的干净架构
  5. spring基于注释的配置_基于注释的Spring MVC Web应用程序入门
  6. 如何测试Java类的线程安全性
  7. drools 决策表_骆驼和春天的Drools决策表
  8. java安全级别过高_Java应该是更高级别还是更低级别?
  9. 测试Java EE 8规范
  10. 使用Apache Storm和Apache Ignite进行复杂的事件处理(CEP)