Hibernate继承:每个类层次结构的表

在本教程中,我们将看到如何在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/369170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取新闻

import requests from bs4 import BeautifulSoup urlhttp://news.gzcc.cn/html/xiaoyuanxinwen/ resrequests.get(url) res.encodingutf-8 soupBeautifulSoup(res.text,html.parser) 1. 用requests库和BeautifulSoup库&#xff0c;爬取校园新闻首页新闻的标题、链接、正文。 fo…

平衡二叉树的自顶向下递归和自底向上递归

没太搞懂自顶向下和自底向上的递归区别

NI Multisim元件库:在Multisim中创建自定义元器件

转载于&#xff1a; http://www.ni.com/tutorial/3173/zhs/ 概览 「在Multisim中创建自定义元器件」与「在 NI Ultiboard中创建自定义元器件」为您提供了关于如何直观、快速地学习如何创建您自己的自定义元器件的信息资源。目录 引言步骤一&#xff1a;输入初始元器件信息步骤二…

字符串的预处理

C isalpha、isalnum、islower、isupper用法 https://blog.csdn.net/weixin_41162823/article/details/80172379 C/C库函数&#xff08;tolower/toupper&#xff09;实现字母的大小写转换 https://blog.csdn.net/laozhuxinlu/article/details/51539737 字符串的逆序 https:…

2017年最新基于Bootstrap 4 的专业、多用途响应式布局的系统模板

本文分享一款2017年最新的2017年最新基于Bootstrap 4 的专业、多用途响应式布局的系统模板&#xff0c;该模板是一款强大并且非常灵活的后台管理系统模板&#xff1a;能适应绝大多数的web应用程序开发&#xff0c;比如&#xff1a;APP的管理后台&#xff0c;电商网站&#xff0…

您的日志就是您的数据:logstash + elasticsearch

今天的帖子的主题与日常的编码和开发无关&#xff0c;但是涵盖了一个非常重要的主题&#xff1a;我们的应用程序日志文件。 我们的应用程序确实会生成大量日志&#xff0c;如果处理正确&#xff0c;则非常有助于解决问题。 如果您启动并运行一个应用程序并没什么大不了&#xf…

关于C++中二维vector使用

https://blog.csdn.net/u014453443/article/details/98057251

面向对象设计与构造第一次总结作业

第一次作业——多项式计算 ---结构分析 第一次作业我只使用了两个类&#xff0c;正像下面的类图所表示的那样&#xff0c;分别是Poly和ComputePoly。Poly类是不可变的&#xff0c;能保存一个多项式&#xff0c;可以进行加、减运算。ComputePoly是程序的主类&#xff0c;能够读取…

python字符串常见操作

字符串常见操作 如有字符串mystr hello world itcast and itcastcpp&#xff0c;以下是常见的操作 <1>find 检测 str 是否包含在 mystr中&#xff0c;如果是返回开始的索引值&#xff0c;否则返回-1 mystr.find(str, start0, endlen(mystr))<2>index 跟find()方法…

调整图像的灰度级数C++实现

图像灰度级数我们见得最多的就是256了&#xff0c;如果想调整它的灰度级数&#xff0c;我们可以使用图像库的imadjust函数来作出调整&#xff0c;比如讲256个灰度级变成2个灰度级&#xff08;也就是二值图了&#xff09;。再举一个例子&#xff0c;原来一幅256个灰度级的图像&a…

[BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBDescription YYD为了减肥&#xff0c;他来到了瘦海&#xff0c;这是一个巨大的海&#xff0c;海中有n个小岛&#xff0c;小岛之间有m座桥连接&#xff0c;两个小岛之间不会有两座桥&#xff0c;并且从一个小岛…

excel和python建模_利用Excel学习Python:准备篇

写在前面这个系列我们要利用Excel的知识&#xff0c;学会用python进行数据分析&#xff0c;如果你精通Excel想要用python提高数据分析效率&#xff0c;那么这个系列你来对了&#xff0c;如果你已经是python大神&#xff0c;想要建模/算法等高级技巧的&#xff0c;这个系列可能不…

方法内联在JVM中有多积极?

IntelliJ IDEA中使用Ctrl Alt M 提取方法 。 Ctrl Alt M。 这就像选择一段代码并按此组合一样简单。 Eclipse也有它 。 我讨厌冗长的方法。 对于我来说&#xff0c;闻起来太久了&#xff1a; public void processOnEndOfDay(Contract c) {if (DateUtils.addDays(c.getCrea…

Python正则表达式基础

1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具&#xff0c;拥有自己独特的语法以及一个独立的处理引擎&#xff0c;效率上可能不如str自带的方法&#xff0c;但功能十分强大。得益于这一点&#xff0c;在提供了正则表…

Java并发:隐藏线程死锁

大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程&#xff0c;它们彼此永远等待。 这种情况通常是平面&#xff08;同步&#xff09;或ReentrantLock&#xff08;读或写&#xff09;锁排序问题的结果。 Found one Java-level deadlock:"pool-1-thread-2"…

vue中使用axios发送请求

我们知道&#xff0c;vue2.0以后&#xff0c;vue就不再对vue-resource进行更新&#xff0c;而是推荐axios&#xff0c;而大型项目都会使用 Vuex 来管理数据&#xff0c;所以这篇博客将结合两者来发送请求 1.安装axios cnpm i axios -S 2.方案一&#xff1a;修改原型链 首先&…

django缓存

由于Django是动态网站&#xff0c;所有每次请求均会去数据进行相应的操作&#xff0c;当程序访问量大时&#xff0c;耗时必然会更加明显&#xff0c;最简单解决方式是使用&#xff1a;缓存&#xff0c;缓存将一个某个views的返回值保存至内存或者memcache中&#xff0c;5分钟内…

linux 输入法成繁体字_寻找Ubuntu中繁体字输入法

当客户来自港台地区时&#xff0c;英文和繁体字就成了交流的主要工具。windows下我们有搜狗输入法可以切换简体与繁体&#xff0c;那么Ubuntu下怎么办&#xff1f;這是我第一次考慮這個問題&#xff0c;在我的印象裏Linux下的中文輸入法還不是那麼完善&#xff0c;所以我進行了…

vue跨域解决方法

vue跨域解决方法 vue项目中&#xff0c;前端与后台进行数据请求或者提交的时候&#xff0c;如果后台没有设置跨域&#xff0c;前端本地调试代码的时候就会报“No Access-Control-Allow-Origin header is present on the requested resource.” 这种跨域错误。 要想本地正常的调…

CSS盒子模型之详解

前言&#xff1a; 盒子模型是css中最核心的基础知识&#xff0c;理解了这个重要的概念才能更好的排版&#xff0c;进行页面布局。一、css盒子模型概念 CSS盒子模型 又称框模型 (Box Model) &#xff0c;包含了元素内容&#xff08;content&#xff09;、内边距&#…