- 浏览: 748183 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
hsl313:
源码还有得下载吗?
利用AMF数据封装与Flash 进行Socket通讯 -
zhang5476499:
已看,谢谢讲解。
Mock单元测试 -
Buydeful:
...
关于JSP或HTML的命名规范 -
lliiqiang:
单一登陆最好采用踢掉方法,如果忘记退出,可以从别的地方控制方式 ...
Jquery选择器大全 -
lliiqiang:
web代码由后台动态生成,这种动态方式多种多样,多提供几种标准 ...
Jquery选择器大全
Hibernate/JPA中的继承映射 实体extends的关系(每个子类独立一个表)
http://blog.csdn.net/skytalemcc/archive/2010/01/15/5196286.aspx
Hibernate的继承映射包含了三种不同的策略:
每簇类使用一个表;
每个子类一个表;
每个具体内一个表(有限制)。
假设我们有四个类Animal,Dog,Cat,其代码如下:
文件名:Animal.java
class Animal {
private String identifier;
private String name;
private String category;
// setter and getter
}
文件名:Dog.java
class Dog extends Animal {
private String
// setter and getter
}
文件名:Cat.java
class Cat extends Animal {
private String
// setter and getter
}
每簇类使用一个表
使用每簇类使用一个表的策略时,有一个限制就时子类不能有NOT NULL,映射文件为:
文件名:Animal.hbm.xml
<class name="Animal" table="TB_ANIMAL">
<id name="identifier" type="string" column="IDENTIFIER">
<generator class="uuid.hex"/>
</id>
<discriminator column="ANIMAL_TYPE" type="string"/>
<property name="name" column="NAME" type="string"/>
<subclass name="Dog" discriminator-value="DOG">
</subclass>
<subclass name="Cat" discriminator-value="CAT">
</subclass>
</class>
每个子类一个表
使用每个子类一个表的策略时,可以使用一个映射文件实现,也可以分成多个映射文件来实现。每个子类一个映射文件的情况:
文件名:Animal.hbm.xml
<class name="Animal" table="ANIMAL">
<id name="identifier" column="IDENTIFIER" type="string">
<generator class="uuid.hex"/>
</id>
<property >
</class>
文件名:Dog.hbm.xml
<joined-subclass name="Dog" table="DOG" extends="Animal">
<key column="DOG_ID"/>
</joined-subclass>
文件名:Cat.hbm.xml
<joined-subclass name="Cat" table="CAT" extends="Cat">
<key column="CAT_ID"/>
</joined-subclass>
每个子类一个表的策略实际上一种one-to-one的映射。
每个具体内一个表(有限制)
使用每个具体内一个表(有限制)策略时,每一个子类的映射文件将要包含所有父类中的属性,映射文件:
文件名:Dog.hbm.xml
<class name="Dog" table="DOG">
<id name="identifier" column="IDENTIFIER" type="string">
<generator class="uuid.hex"/>
</id>
<property name="name" column="NAME" type="string"/>
</class>
文件名:Cat.hbm.xml
<class name="Cat" table="CAT">
<id name="identifier" column="IDENTIFIER" type="string">
<generator class="uuid.hex"/>
</id>
<property name="name" column="NAME" type="string"/>
</class>
JPA中的实体层次设计
这部分的内容基本与Hibernate一致.JPA同样支持3种类型的继承形式:
1.Single Table Strategy ,单表策略,一张表包含基类与子类的所有数据,很多情况下都是采用这样的冗余设计,通过一个discriminator来区分
2.Table Per Class Strategy ,每个子类对应一张表,每张表都拥有基类的属性
3.Join Strategy ,仍然是每个子类对应一张表,但此表中不包含基类的属性,仅仅是此子类的扩展属性,共享基类的属性
以一个例子来说明3种情况:
一.单表策略
比如Pet作为基类,Cat和Dog继承此类并拥有自己的扩展属性,如:
package com.denny_blue.ejb3.inheritance;
import java.io.Serializable;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "animal_type", discriminatorType = DiscriminatorType.STRING)
public class Pet implements Serializable {
private int id;
private String name;
private double weight;
public Pet() {
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
}
Pet类值的注意的就是通过@Inheritance(strategy = InheritanceType.SINGLE_TABLE)确定采用单表策略,通过@DiscriminatorColumn确定了标志值的字段和类型,我想熟悉hibernate的朋友对这些都应该很熟悉.然后是两个子类:
//Cat.java
package com.denny_blue.ejb3.inheritance;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("cat")
public class Cat extends Pet {
private String HairBall;
public String getHairBall() {
return HairBall;
}
public void setHairBall(String hairBall) {
HairBall = hairBall;
}
}
//Dog.java
package com.denny_blue.ejb3.inheritance;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("dog")
public class Dog extends Pet {
private String trick;
public String getTrick() {
return trick;
}
public void setTrick(String trick) {
this.trick = trick;
}
}
两个子类最值的关注的就是@DiscriminatorValue注释,比如Cat的此值为cat,意味着当Cat类型的Entity存入数据库时,JPA将自动把cat的值赋给animal_type字段,Dog的值则为dog,由此就可以在同一张表中区分开两个不同的子类.
二.Table per Class
采用Table Per Class策略的话,每个子类都将单独建表,并且都独立拥有基类中的所有属性,互相之间不共享,在我们的例子中所要进行的修改很小,像这样:
//基类
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Pet implements Serializable {
private int id;
private String name;
private double weight;
........
//子类:不需要任何设置
@Entity
public class Dog extends Pet {
private String trick;
.......
.......
}
例:
@Entity
@Table(name = "TEST_A")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class TestA implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = 5931010626625178698L;
private Long id;
private String name;
private String code;
// Constructors
public TestA() {
}
/** minimal constructor */
public TestA(Long id) {
this.id = id;
}
/** full constructor */
public TestA(Long id, String name, String code) {
this.id = id;
this.name = name;
this.code = code;
}
// Property accessors
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO, generator = "SEQ")
@SequenceGenerator(name="SEQ", sequenceName = "SEQ_TEMP_VOICE_FILE")
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "NAME", unique = false, nullable = true, insertable = true, updatable = true, length = 200)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name = "CODE", unique = false, nullable = true, insertable = true, updatable = true, length = 200)
public String getCode() {
return this.code;
}
public void setCode(String code) {
this.code = code;
}
}
@Entity
@Table(name = "TEST_B")
public class TestB extends TestA {
// Fields
/**
*
*/
private static final long serialVersionUID = 4942564072409132522L;
/** minimal constructor */
public TestB() {
}
public TestB(Long id) {
this.setId(id);
}
@Column(name = "FLAG", unique = false, nullable = true, insertable = true, updatable = true, precision = 1, scale = 0)
public Long getFlag() {
return this.flag;
}
public void setFlag(Long flag) {
this.flag = flag;
}
}
三.Join策略
每个子类同样独立建表,基类也独立建表,只不过所有的子类的表中只有扩展属性,他们共享基类的表,在我们的例子中修改下即可:
//基类
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pet implements Serializable {
private int id;
private String name;
private double weight;
........
//子类
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Dog extends Pet {
private String trick;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/skytalemcc/archive/2010/01/15/5196286.aspx
发表评论
-
Processlist命令
2011-07-06 17:36 2347使用show processlist命令,查看mysql中线程 ... -
Mysql慢查询日志分析
2011-07-06 17:31 1218mysql有一个功能就是可以log下来运行的比较慢的sql语句 ... -
Mysql变量含义
2011-07-06 17:16 2243http://dev.mysql.com/doc/refman ... -
MySql优化
2011-03-09 17:56 11111.数据库的设计 尽量把 ... -
转:Ubuntu安装Oracle客户端
2010-11-26 10:10 9479http://329937021.iteye.com/blog ... -
mysql全文检索
2010-04-14 11:04 3435mysql到版本3.23.23时,开 ... -
SQL 语句性能调优
2010-02-06 13:19 1376经常听到有做应用的朋友抱怨数据库的性能问题,比如非 ... -
数据库表结构设计方法及原则
2009-11-27 15:38 2190最近发现自己的表设计能力不行,所以转篇文章看看: 在目前 ... -
Oracle取交集
2009-11-16 16:41 2289select t.experiment_process ... -
数据库设计范式
2009-10-28 11:14 1166关系数据库设计之时是 ... -
Hibernate Session篇--Hibernate的缓存及对象的状态
2009-09-10 15:24 1462对于session这个接口的学习可以说是最痛苦也是最复杂的,因 ... -
hibernate执行的顺序
2009-09-10 15:17 2178session.evict(obj),会把指定的缓冲对象进行清 ... -
Hibernate的flush机制
2009-09-10 15:16 1217随着Hibernate在Java开发 ... -
hibernate:管理缓存(Managing the caches)
2009-09-10 14:13 1237管理缓存(Managing the cac ... -
hibernateStatelessSession (无状态session)接口
2009-09-10 14:12 5157StatelessSession (无状态session)接口 ... -
Hibernate的缓存
2009-07-22 12:41 1206Hibernate的缓存分为: 一级缓存:在 ... -
Hibernate之中inverse与cascade的异同
2009-04-04 13:45 9631、到底在哪用cascade="...&qu ... -
允许用户远程访问Mysql数据库
2009-03-24 22:31 1651Db表中的Host字段为%,如果是localhost,则只能本 ... -
Mysql 的 Cascade Restrict
2009-03-20 16:51 23256外键约束对子表的含义: 如果在父表中找不到候选键,则不允许 ... -
【MySql存储过程】DATE_ADD用法
2009-02-04 14:48 5003定义和用法 DATE_ADD() 函数向日期添加指定的时间间 ...
相关推荐
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。而JPA(Java Persistence API)是Java平台上的一个标准,用于管理关系数据库中的数据,它也是...
【JPA教程】Java Persistence API (JPA) 是Java EE 5.0引入的一个ORM(对象关系映射)规范,它的目标是简化Java应用程序中对象持久化的开发工作,并且统一ORM技术。JPA的设计吸取了EJB(Enterprise JavaBeans)经验...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句的编写。然而,为了提高代码的复用性和可维护性,通常会设计一个通用DAO...
Hibernate 是一款流行的 Java 持久层框架,它通过 ORM(对象关系映射)技术将 Java 应用程序中的对象模型与数据库的关系模型之间建立桥梁,实现对象数据与关系型数据库数据之间的转换。在 Hibernate 中,可以使用 ...
Java Persistence API (JPA) 和 Hibernate 是两个常见的工具,它们可以帮助我们将Java对象映射到关系型数据库中的表,实现对象关系映射(ORM)。 8. **序列化与反序列化**:为了将等级实体对象保存到文件或在网络上...
JPA是Java平台上的一个标准,它定义了一套API,用于将Java对象映射到数据库表。通过JPA,开发者无需编写大量的SQL语句,只需定义实体类和持久化注解,即可完成数据的CRUD操作。 2. **Spring Data JPA** Spring ...
在Java开发领域,Spring框架和Hibernate是两个非常重要的库,它们分别用于管理和简化应用程序的依赖注入以及对象关系映射(ORM)。在这个项目中,我们将深入探讨如何在Hibernate中利用Spring来构建一个简单但功能...
面向对象编程(OOP)是一种编程范式,以对象为中心,通过类和对象表示现实世界中的实体和它们之间的关系,强调封装、继承和多态等特性,使代码更加模块化和可复用。 11. **访问数据库的其他方式**: - JPA(Java ...
- **数据访问**:在Spring Data JPA或MyBatis等持久层框架中,使用泛型定义Repository接口,可以实现对特定类型的实体进行操作,例如`List<User> findByUsername(String username)`。 2. **Struts框架中的泛型** ...
学习如何使用Hibernate或JPA进行实体类与数据库表的映射。 #### 八、框架与高级技术 **目标:** 学习并掌握流行的Java框架和高级技术,如Spring Boot、Spring Cloud、MyBatis等。 1. **Spring Boot:** - **快速...
它需要一个`DataSource`,并为子类提供了一个`JdbcTemplate`实例,使得开发者能够方便地执行SQL查询和更新操作,而无需直接处理连接管理和异常处理。`JdbcTemplate`提供了事务管理、参数绑定和结果集处理等功能,...
本篇将重点讨论如何在Obj-C、Swift和Java这三种编程语言中构建一个高效的数据访问层,特别是针对快速数据上下文切换的设计。 首先,我们来看Swift的例子。Swift是一种现代化的编程语言,常用于iOS、macOS等Apple...