Hibernate继承:每个类层次结构的表
在本教程中,我們將看到如何在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)題。
- 上一篇: 华为 Mate 60 / 60 Pro
- 下一篇: 幻像类型提高了编译时的安全性