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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值