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
總結
以上是生活随笔為你收集整理的Hibernate继承:每个类层次结构的表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为 Mate 60 / 60 Pro
- 下一篇: 三星花费近2万亿韩元购买中国液晶显示器