`

hibernate annoation (七 继承映射)

阅读更多

Table per Class Strategy: the <union-class> element in Hibernate
Single Table per Class Hierarchy Strategy: the <subclass> element in Hibernate
Joined Subclass Strategy: the <joined-subclass> element in Hibernate
ejb支持三种映射关系
1,每个类一张表 (hibertnate里对应<union-class>)
2,每个类层次一张表 (在 hibernate里对应<subclass>)
3,连接的子类(对应join-subclass)

   目前不支持在接口上进行注解
(1)每个类一张表:
在父类class-level上设置:@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
例如:

class A代码:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class A {

 private int id;
 private String aname;
 @Id
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getAname() {
  return aname;
 }
 public void setAname(String aname) {
  this.aname = aname;
 }
 
}

class B extends A代码:
@Entity
public class B extends A{

 private String bname;

 public String getBname() {
  return bname;
 }

 public void setBname(String bname) {
  this.bname = bname;
 }
 
}
class C extends A代码:
@Entity
public class C extends A{

 private String cname;


 public String getCname() {
  return cname;
 }

 public void setCname(String cname) {
  this.cname = cname;
 }

 
}

 

最终生成sql语句:

create table A (id integer not null auto_increment, aname varchar(255), primary key (id))
create table B (id integer not null, aname varchar(255), bname varchar(255), primary key (id))
create table C (id integer not null, aname varchar(255), cname varchar(255), primary key (id))

 

B 和 C 都继承了A但是没有关联

(2)每个类层次一张表:也就是所有继承的类和父类共享一张表 通过一个辨别符号进行区分
这需要在父类上使用:@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
这样的话在表里面会多出一个字段:DTYPE(默认 默认值为entry.class)
可以通过在父类class-level上设置
@DiscriminatorColumn(name="mytype",discriminatorType=DiscriminatorType.STRING)
在之类上使用
例如:
@Entity
@DiscriminatorValue(value="ctype")
插入数据时候将会有下列语句产生:Hibernate: insert into A (aname, cname, mytype) values (?, ?, 'ctype');

(3)每个字类一张表:也就是字类的关联到父类的主键
 通过在父类上使用:@Inheritance(strategy=InheritanceType.JOINED)
 产生语句:默认id关联

 create table A (id integer not null auto_increment, aname varchar(255), primary key (id))
 create table B (bname varchar(255), id integer not null, primary key (id))
 create table C (cname varchar(255), id integer not null, primary key (id))
 alter table B add index FK42FCA55807 (id), add constraint FK42FCA55807 foreign key (id) references A (id)
 alter table C add index FK43FCA55807 (id), add constraint FK43FCA55807 foreign key (id) references A (id)

 
也可以指定关联 例如:在B的class-level上使用@PrimaryKeyJoinColumn(name="bid")
生成sql语句:

create table B (bname varchar(255), bid integer not null, primary key (bid))
alter table B add index FK42FCA6C7E9 (bid), add constraint FK42FCA6C7E9 foreign key (bid) references A (id)

 
但是我们不能关联到A的非主键字段例如:
在B上使用
@PrimaryKeyJoinColumn(name="bid",referencedColumnName="aname")则会报错:SecondaryTable JoinColumn cannot reference a non primary key
  当然也可以给之类关联设置不同的类型例如:@PrimaryKeyJoinColumn(name="bid",columnDefinition="carchar(20)")但是不能设置不能转换的类型例如:
@PrimaryKeyJoinColumn(name="bid",columnDefinition="blob")则会建立不了关联

(4)从实体继承 但是父类不持久化:使用@MappedSuperclass
sql语句:

create table B (id integer not null auto_increment, aname varchar(255), bname varchar(255), primary key (id))
create table C (id integer not null auto_increment, aname varchar(255), cname varchar(255), primary key (id))

 
 当然可以使用@AttributeOverride或者@AssociationOverride进行覆盖

分享到:
评论

相关推荐

    Hibernate继承映射代码

    在大型项目中,由于业务需求复杂,我们常常会使用到类的继承来组织代码结构,而Hibernate提供了对这些继承关系的映射支持。本主题将深入探讨"Hibernate继承映射+C3P0代码"的相关知识点。 首先,让我们理解Hibernate...

    hibernate七种映射

    便于同学们更好的学习hibernate,其中包含了hibernate的七种映射管、关系

    Hibernate教程17_继承映射

    本教程主要探讨的是Hibernate中的“继承映射”特性,这是一项关键功能,它允许我们将复杂的类继承结构映射到数据库表中。通过继承映射,我们可以有效地管理和组织数据,提高代码的复用性和可维护性。 在Hibernate中...

    用Hibernate映射继承关系

    ### 用Hibernate映射继承关系 #### 14.1 继承关系树的每个具体类对应一个表 在Hibernate中映射继承关系时,一种常见的策略是将继承关系树的每个具体类映射到单独的数据库表中。这种方法称为**表/类映射**(Table/...

    hibernate继承映射.rar

    《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的...

    Hibernate教程17_继承映射_补充2

    在本教程中,我们将深入探讨Hibernate中的继承映射,特别是在"Hibernate教程17_继承映射_补充2"中所涉及的主题。Hibernate是Java中一个非常流行的对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库...

    Hibernate教程17_继承映射_补充1

    在本教程中,我们将深入探讨Hibernate中的继承映射策略,特别是"Table Per Class"策略,这是Java对象模型到关系数据库映射的一种方法。在Hibernate框架中,继承是通过ORM(对象关系映射)来实现的,它允许我们将复杂...

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...

    Hibernate继承映射(annotation)

    **标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在使用注解的方式进行配置时,这个过程变得更加...

    hibernate的继承映射教学

    针对hibernate的继承映射部分做了几个测试的例子,更加直观的阐述了继承映射的几种方式以及对应的表结构方式,文件被分割成3部分 http://download.csdn.net/source/259075 http://download.csdn.net/source/259072 ...

    Hibernate继承映射-概述

    《Hibernate继承映射详解》 在Java开发中,对象关系映射(ORM)框架如Hibernate大大简化了数据库操作。Hibernate不仅提供了对基本数据类型的映射,还支持复杂的数据结构,如继承关系的映射。本篇文章将深入探讨...

    Hibernate继承映射

    Hibernate的继承映射 --每个继承层次一张表 -- 每个具体类一张表 -- 每个类一张表

    hibernate的继承映射关系

    ### Hibernate的继承多态映射关系详解 在软件开发领域,特别是使用面向对象编程语言如Java进行开发时,我们经常需要处理复杂的类继承关系。在ORM(Object-Relational Mapping)框架如Hibernate中,如何优雅地将这些...

    hibernate的继承映射(InheritanceMapping)[文].pdf

    本文将深入探讨Hibernate中的继承映射(Inheritance Mapping)策略,这是处理对象模型中继承关系在数据库中的映射方式。 10.1. Hibernate继承映射的三种基本策略: 10.1.1. 每个类分层结构一张表(Table per class...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

Global site tag (gtag.js) - Google Analytics