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 setters public 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 setters public 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