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,一经查实,立即删除!

相关文章

锁 mysql_Mysql的锁(S锁和X锁的区别)

共享锁和排它锁Mysql的锁系统&#xff1a;shared lock 和 exclusive lock (共享锁和排它锁&#xff0c;也叫读锁和写锁&#xff0c;即read lock和write lock)读锁是共享的&#xff0c;或者说是相互不阻塞的写锁是排他的&#xff0c;一个写锁会阻塞其他的写锁和读锁在实际的数据…

爬取新闻

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…

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

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

【简记】HTML CSS 的一些要点(不定时更新)

1.td占据多行 / 列时&#xff0c;其挤开的 td 不写&#xff08;但是包裹 td 的 tr 要写&#xff09; 2. display:td 的元素中的文本默认垂直不居中&#xff08;table中的td中的文本是垂直居中的&#xff09; 3.th虽然定义了表头标题&#xff0c;但是默认不跨行&#xff08;需…

通过地址访问 mysql_MySql通过ip地址进行访问的方法

1.登录mysql&#xff1a;mysql -u root -h 127.0.0.1 -p2.切换数据库use mysql3.授权grant all privileges on *.* to root127.0.0.1identified by 密码;将127.0.0.1换成公网的ip地址。4.检查my.ini4.1 看看是否有skip-networkingskip-networking开启该选项后就不能远程访问MyS…

幻像类型提高了编译时的安全性

介绍 使用幻像类型是一种非常简单的技术&#xff0c;可用于提高代码的编译时安全性。 有许多潜在的用例具有不同的复杂性级别&#xff0c;但是即使幻像类型的使用非常轻巧&#xff0c;也可以显着提高编译时的安全性。 幻像类型只是带有未使用类型参数的参数化类型。 例如&#…

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…

apache gobblin mysql_gobblin简单使用

一、下载编译解压后查看目录下是否存在gradle/wrapper/gradle-wrapper.jar 文件使用 ./gradlew build -x findbugsMain -x test -x rat -x checkstyleMain编译项目(因网络因素可能有几次失败)编译后文件apache-gobblin-incubating-bin-0.14.0.tar.gz二、配置编写启动命令(需指定…

liunx之Centos6.8杀毒软件的安装

作者:邓聪聪 为了防止服务器中病毒&#xff0c;安装了类似与Windowns的杀毒软件Clanav&#xff0c;过程如下 首先下载clamav的软件包&#xff0c;官方下载地址为http://www.clamav.net/download.html 。我这里是下载好的rpm包链接&#xff1a;https://pan.baidu.com/s/1n052Udk…

上位机串行通讯的通用思路

先上代码&#xff1a; public class SerialPortServer{//字段SerialPort SP new SerialPort();int DelayTime 5000;//默认是5sstring Info "";string SendStringBuffer "";string ReceiveStringBuffer "";//构造函数public SerialPortServe…

您的日志就是您的数据: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;能够读取…

想提升java知识的同学请进

这是我最近在整理的笔记&#xff0c;大家可以看看。 https://www.gitbook.com/book/jackal007/java_more/ 如果觉得有问题可以提出&#xff0c;随时修改。 这个笔记是我花了好多时间看各种书籍&#xff0c;博客后整理的&#xff0c;希望能帮助到更多的朋友。转载于:https://www…

mysql 3种报错_MySQL读取Binlog日志常见的3种错误-阿里云开发者社区

MySQL读取Binlog日志常见的3种错误mysqlbinlog: [ERROR] unknown variable default-character-setutf8mb4当我们在my.cnf中添加default-character-setutf8mb4选项&#xff0c;那么在mysqlbinlog查看binlog时就会报错。解决方案&#xff1a;.mysqlbinlog 后面添加 --no-defaults…

膨胀的JavaBeans –不要在您的API中添加“ Getters”

我已经最近在博客的想法的JavaBeans™如何可以扩展以减少在Java世界中&#xff0c;这被广泛接受的公约设立的膨胀。 该文章在DZone上重新发布&#xff0c;并在这里获得了颇具争议的反馈&#xff08;例如&#xff0c;大多数试图将一些新想法带入Java世界的想法&#xff09;。 我…

css:hover伪类的使用

&#xff1a;hover的使用&#xff0c;即当鼠标指针移入元素时&#xff0c;所做出的样式设置 示例一 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>demo01</title><style>*{margin: 0;p…

Redis内存淘汰机制

转自&#xff1a;https://my.oschina.net/andylucc/blog/741965 摘要 Redis是一款优秀的、开源的内存数据库&#xff0c;我在阅读Redis源码实现的过程中&#xff0c;时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思&#xff0c;例如最明显的是对于同一种数据结构在不…