hibernate 继承_Hibernate继承:每个类层次结构的表
hibernate 继承
在本教程中,我们将了解如何在hibernate中实现继承。可以通过3种方式在hibernate中实现继承。在本文中,我们将看到其中一种,即每个类层次结构一个表。
Hibernate中的继承:
Java是面向对象的语言,继承是Java的主要功能之一。关系模型可以实现“是”和“具有”关系,但是Hibernate为我们提供了以不同方式实现类层次结构的方法。
每个类层次结构一张表:
假设我们具有以下类层次结构,我们将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 继承
hibernate 继承_Hibernate继承:每个类层次结构的表相关推荐
- Hibernate继承:每个类层次结构的表
在本教程中,我们将看到如何在hibernate中实现继承.有3种方法可以在hibernate中实现继承.在本文中,我们将看到其中一种,即每个类层次结构一个表. 休眠中的继承: Java是面向对象的语言 ...
- spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)
本文是在上一篇博文的基础之上,通过继承HibernateDaoSupport调用hibernateTemplate类,只要将UserDaoImpl.java改为继承HibernateDaoSuppor ...
- hibernate继承关系映射方法(三)--每个具体类一张表TPC
TPC:所谓是"每个具体类一张表(table per concrete class)"的意思是:使继承体系中每一个子类都对应数据库中的一张表.每一个子类对应的数据库表都包含了父类的 ...
- java继承 映射_hibernate继承关系映射和java反射机制的运用
转:http://blog.csdn.net/derpvailzhangfan/article/details/1957946 ,感谢博主分享 Notes:hibernate元数据的运用:uuid的概 ...
- (8)hibernate四种继承映射
一 一个类继承体系一张表 1 对象模型(java类结构) 2 映射后据库中的表 3 代码 Employee.java package com.learning;public class Employe ...
- java派生类如何使用_继承:使用基类或派生类来做东西[关闭]
这是一个关于应该使用继承方式的简单问题 . 考虑到我必须提供业务逻辑来打印'foo'和'bar'并且我有两个类的层次结构:一个具有仅打印'foo'的方法和另一个首先扩展并具有打印'bar'的方法 . ...
- Hibernate学习(3) (继承映射,配置文件和注解版)
这篇blog准备写怎样在Hibernate中反应内存对象之间的继承关系.我们知道,内存对象之间是可以有继承关系的,但是在数据库中,我们继承神马的都是浮云,不存在的.那么怎么办呢?Hibernate提供 ...
- 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题
继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...
- java 枚举的继承_java中枚举类可以被继承吗?
java 枚举类 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: ● 枚举类继承了java.lang.Enum类,而不是默认的Object类.而 ...
最新文章
- R语言return返回值的形式实战
- 反射学习4-通过反射机制动态创建和访问数组
- java和mysql中md5+base64的执行结果
- Oracle 11g RAC SCAN ip的原理及配置
- 一个三流学校程序员的奋斗历程
- 《软件测试与质量保证》期末复习重点
- mql 查询多结果_详解Oracle分页查询概念、缘由及如何实现
- python:函数的参数传递方法演示
- Linux经常使用命令(十六) - whereis
- 移动硬盘上安装Windows 10系统
- qtouch跨平台组态软件
- 一键搭建kms激活服务器
- 穿戴-智能穿戴-ProjectGlass:谷歌眼镜(Google Project Glass)
- 新加坡区块链ICO公司是如何注册新加坡公司的
- 不同CPU的MATLAB性能表现的简单对比方法
- python编程财务_Python笔记 财务小白的 day3 python编程基础(1)
- 最大堆和最小堆(数据结构)
- C++ —— 类的使用
- jquery 上传空间uploadify使用笔记
- 腾讯新产品砸了所有鉴黄师的饭碗