日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate继承:每个类层次结构的表 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在本教程中,我們將看到如何在hibernate中實(shí)現(xiàn)繼承。有3種方法可以在hibernate中實(shí)現(xiàn)繼承。在本文中,我們將看到其中一種,即每個(gè)類層次結(jié)構(gòu)一個(gè)表。

休眠中的繼承:

Java是面向?qū)ο蟮恼Z(yǔ)言,繼承是Java的主要功能之一。關(guān)系模型可以實(shí)現(xiàn)“是”和“具有”關(guān)系,但是休眠為我們提供了以不同方式實(shí)現(xiàn)類層次結(jié)構(gòu)的方法。

每個(gè)類層次結(jié)構(gòu)一張表:

假設(shè)我們具有以下類層次結(jié)構(gòu),我們以shape類為基類,而Rectangle和Circle繼承自Shape類。

在每個(gè)類層次結(jié)構(gòu)的一個(gè)表中,將為以上層次結(jié)構(gòu)創(chuàng)建一個(gè)表。即,將創(chuàng)建具有以下結(jié)構(gòu)的SHAPE表。

如您所見(jiàn),僅創(chuàng)建了一個(gè)具有子類屬性的表(SHAPE)。 根據(jù)上面的類圖,我們將創(chuàng)建三個(gè)類-Shape.java,Rectangle.java和Circle.java

1.Shape.java

這是我們實(shí)體類層次結(jié)構(gòu)的根類。

在SRC-> org.arpit.javapostsforlearning創(chuàng)建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是我們的根類,因此一些注釋需要與根類一起使用以實(shí)現(xiàn)繼承。

@遺產(chǎn):

為了在hiberante中實(shí)現(xiàn)繼承,使用@Inheritance批注。該批注定義了要為實(shí)體類層次結(jié)構(gòu)實(shí)現(xiàn)的繼承策略。對(duì)于每個(gè)類層次結(jié)構(gòu)的一個(gè)表,我們已使用Single_Table作為繼承策略。此批注在根級(jí)別或子層次結(jié)構(gòu)級(jí)別定義適用不同策略的地方。

@DiscriminatorColumn:

該注釋用于定義Single_Table和聯(lián)接策略的區(qū)分符列,用于區(qū)分不同的類實(shí)例。此注釋在要應(yīng)用不同策略的根級(jí)別或子層次結(jié)構(gòu)級(jí)別定義。 如果未指定@DiscriminatorColumn批注,則hibernate將創(chuàng)建一個(gè)名為“ DType”的列,而DiscriminatorType將為字符串。

@DiscriminatorValue:

這個(gè)注解定義了該類在鑒別符列中的值。這只能應(yīng)用于實(shí)體具體類。例如,如果條目將是SHAPE表中的形狀實(shí)例,則's'將是鑒別符列中該行的值。未指定注釋,并且使用Discriminator列,則將提供提供者特定的值,如果Discriminator類型為String,則鑒別符值將是實(shí)體名稱。Discriminator值,如果沒(méi)有默認(rèn)值,則需要在層次結(jié)構(gòu)中的每個(gè)實(shí)體上指定。

2,Rectangle.java

這是我們的孩子班。

在src-> org.arpit.javapostsforlearning中創(chuàng)建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

這是我們的第二個(gè)孩子班。

在SRC-> org.arpit.javapostsforlearning創(chuàng)建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文件夾中創(chuàng)建一個(gè)名為“ 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,運(yùn)行它

運(yùn)行它時(shí),您將獲得以下輸出。

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輸出

數(shù)據(jù)庫(kù)中的SHAPE表。

參考: Hibernate繼承:我們的JCG合作伙伴 Arpit Mandliya在初學(xué)者博客的Java框架和設(shè)計(jì)模式下的 每個(gè)類層次結(jié)構(gòu)表 。

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

總結(jié)

以上是生活随笔為你收集整理的Hibernate继承:每个类层次结构的表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。