- 浏览: 483759 次
- 性别:
- 来自: 大连
文章分类
最新评论
-
龘龘龘:
TrueBrian 写道有个问题,Sample 1中,为了控制 ...
What's New on Java 7 Phaser -
龘龘龘:
楼主总结的不错。
What's New on Java 7 Phaser -
TrueBrian:
有个问题,Sample 1中,为了控制线程的启动时机,博主实际 ...
What's New on Java 7 Phaser -
liguanqun811:
不知道楼主是否对zookeeper实现的分布式锁进行过性能测试 ...
Distributed Lock -
hobitton:
mysql的get lock有版本限制,否则get lock可 ...
Distributed Lock
7 Inheritance
对象使用引用以便关联到其它对象;关系型数据库表之间采用外键来描述表的关系。在关系型数据库中通常没有自然且有效的方法来描述类的继承关系。JPA通过Inheritance annotation提供了几种继承策略,它有以下属性:
- InheritanceType strategy:用来声明继承策略。可选值是InheritanceType.SINGLE_TABLE、InheritanceType.JOINED和InheritanceType .TABLE_PER_CLASS。缺省值是InheritanceType.SINGLE_TABLE。
关于Inheritance的更多内容,可以参考Hibernate实战by Christian Bauer, Gavin King。
7.1 Single Table
InheritanceType.SINGLE_TABLE 策略为类的继承体系采用同一个表。表名是基类的名称。例如:
@Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public class Base { @Id private int id; @Basic private String baseName; } @Entity public class Derived1 extends Base { @Basic private String derived1Name; } @Entity public class Derived2 extends Base { @Basic private String derived2Name; }
使用MappingTool建立的表结构如下:
mysql> describe base; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | baseName | varchar(255) | YES | | NULL | | | DTYPE | varchar(255) | YES | MUL | NULL | | | derived1Name | varchar(255) | YES | | NULL | | | derived2Name | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+----------------+
EntityManager em = entityManagerFactory.createEntityManager(); em.getTransaction().begin(); Base base = new Base(); base.setBaseName("base"); em.persist(base); Derived1 d1 = new Derived1(); d1.setBaseName("derived1's base"); d1.setDerived1Name("derived1"); em.persist(d1); Derived2 d2 = new Derived2(); d2.setBaseName("derived2's base"); d2.setDerived2Name("derived2"); em.persist(d2); em.getTransaction().commit(); em.close();
以上代码执行后,数据库中base表的数据如下(其中DTYPE列由OpenJPA自动插入,用于区分不同的class,关于Discriminator的详细用法请参考OpenJPA User's Guide):
mysql> select * from base; +----+-----------------+----------+--------------+--------------+ | id | baseName | DTYPE | derived1Name | derived2Name | +----+-----------------+----------+--------------+--------------+ | 1 | base | Base | NULL | NULL | | 2 | derived1's base | Derived1 | derived1 | NULL | | 3 | derived2's base | Derived2 | NULL | derived2 | +----+-----------------+----------+--------------+--------------+
7.1.1 Advantages
InheritanceType.SINGLE_TABLE 策略的优势在于简单且性能高(因为不需要使用连接查询等)。如果类的继承体系中,子类和父类间的差异主要在于行为,同时子类之间以及子类和父类之间的属性差异不大(例如子类不增加属性或者增加的属性数目比较少),那么适用于这个策略。
7.1.2 Disadvantages
这个策略导致规范化级别降低。由于类继承体系中的每个类的属性都要映射到表的一列,因此当类的继承体系变的复杂的时候,表也随之变大。子类中属性对应的列必须声明为nullable。
7.2 Joined
InheritanceType.JOINED策略为类继承体系中的每个类创建不同的表。每个表只包含类中定义的列,因此在load一个子类的时候,JPA实现需要同时查询子类映射的表,以及通过关联查询所有的父类映射的表。PrimaryKeyJoinColumn annotation用来指定子类映射的表如何关联到父类映射的表。它有以下属性:
- String name: 子类映射表中的列名。如果只有一个identity filed,那么缺省使用这个field对应的列名。
- String referencedColumnName: 父类映射表中用来关联的列名。如果只有一个identity filed,那么缺省使用这个field对应的列名。
- String columnDefinition: 数据库中列的数据类型。只有当JPA vendor支持通过metadata创建表的时候,这个属性才被使用。
以下是个简单的例子:
@Entity @Inheritance(strategy=InheritanceType.JOINED) public class Base { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Basic private String baseName; } @Entity @PrimaryKeyJoinColumn(name="id", referencedColumnName="id") public class Derived1 extends Base { @Basic private String derived1Name; } @Entity @PrimaryKeyJoinColumn(name="id", referencedColumnName="id") public class Derived2 extends Base { @Basic private String derived2Name; }
使用MappingTool建立的表结构如下:
mysql> describe base; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | baseName | varchar(255) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ mysql> describe derived1; +--------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | | | | derived1Name | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+-------+ mysql> describe derived2; +--------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | | | | derived2Name | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+-------+
EntityManager em = entityManagerFactory.createEntityManager(); em.getTransaction().begin(); Base base = new Base(); base.setBaseName("base"); em.persist(base); Derived1 d1 = new Derived1(); d1.setBaseName("derived1's base"); d1.setDerived1Name("derived1"); em.persist(d1); Derived2 d2 = new Derived2(); d2.setBaseName("derived2's base"); d2.setDerived2Name("derived2"); em.persist(d2); em.getTransaction().commit(); em.close();
以上代码执行后,数据库中base表的数据如下:
mysql> select * from base; +----+-----------------+ | id | baseName | +----+-----------------+ | 1 | derived2's base | | 2 | derived1's base | | 3 | base | +----+-----------------+ mysql> select * from derived1; +----+--------------+ | id | derived1Name | +----+--------------+ | 2 | derived1 | +----+--------------+ mysql> select * from derived2; +----+--------------+ | id | derived2Name | +----+--------------+ | 1 | derived2 | +----+--------------+
7.2.1 Advantages
InheritanceType. JOINED策略的优势在于数据库表中没有冗余字段,因此规范化级别比较高;当有新的子类加入到类的继承体系中时,已有表的schema无须修改。如果类的继承体系中,子类和父类间的差异不在于行为,同时子类间的属性差异比较大,那么适用于这个策略。
7.2.2 Disadvantages
由于在查询的时候需要进行关联,那么查询的速度会比其它方式慢。此外可能需要多个插入和更新语句来处理多个表。
7.3 Table Per Class
InheritanceType.TABLE_PER_CLASS策略为类继承体系中的每个类创建不同的表。和InheritanceType.JOINED策略不同的是,每个表中包含所有的子类和父类中定义的所有列。因此在load一个子类的时候,JPA实现只需要同时查询子类映射的表。
以下是个简单的例子:
@Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public class Base { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Basic private String baseName; } @Entity public class Derived1 extends Base { @Basic private String derived1Name; } @Entity public class Derived2 extends Base { @Basic private String derived2Name; }
使用MappingTool建立的表结构如下:
mysql> describe base; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | baseName | varchar(255) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ mysql> describe derived1; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | baseName | varchar(255) | YES | | NULL | | | derived1Name | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+----------------+ mysql> describe derived2; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | baseName | varchar(255) | YES | | NULL | | | derived2Name | varchar(255) | YES | | NULL | | +--------------+--------------+------+-----+---------+----------------+
EntityManager em = entityManagerFactory.createEntityManager(); em.getTransaction().begin(); Base base = new Base(); base.setBaseName("base"); em.persist(base); Derived1 d1 = new Derived1(); d1.setBaseName("derived1's base"); d1.setDerived1Name("derived1"); em.persist(d1); Derived2 d2 = new Derived2(); d2.setBaseName("derived2's base"); d2.setDerived2Name("derived2"); em.persist(d2); em.getTransaction().commit(); em.close();
以上代码执行后,数据库中base表的数据如下:
mysql> select * from base; +----+----------+ | id | baseName | +----+----------+ | 1 | base | +----+----------+ mysql> select * from derived1; +----+-----------------+--------------+ | id | baseName | derived1Name | +----+-----------------+--------------+ | 1 | derived1's base | derived1 | +----+-----------------+--------------+ mysql> select * from derived2; +----+-----------------+--------------+ | id | baseName | derived2Name | +----+-----------------+--------------+ | 1 | derived2's base | derived2 | +----+-----------------+--------------+
7.3.1 Advantages
对于已知class类型的实例来说,这个策略十分有效。跟InheritanceType.JOINED策略类似,当有新的子类加入到类的继承体系中时,已有表的schema无须修改。
7.3.2 Disadvantages
这个策略在处理多态关系的时候会存在很多限制,此时某个引用(或者集合中的引用)可能指向任何子类的实例。由于无法使用关联查询,因此在查询的时候可能需要使用多个SQL语句或者使用UNION。
发表评论
-
Terracotta in Action (3)
2009-03-25 09:20 51503 Inside Terracotta 3.1 Core T ... -
Terracotta in Action (2)
2009-03-21 21:09 47152. Terracotta Eclipse Plugin ... -
Terracotta in Action (1)
2009-03-19 21:52 62931. Introduction Terraco ... -
OpenEJB (4)
2008-05-11 09:05 3191本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenEJB (3)
2008-05-11 09:04 2732本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenEJB (2)
2008-05-11 09:03 3326本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenEJB (1)
2008-05-10 22:39 5111本文部分内容节选自Enterprise JavaBeans 3 ... -
OpenJPA (7)
2008-03-25 21:56 357710 Miscellaneous Features 10 ... -
OpenJPA (6)
2008-03-23 21:33 63608 Object Locking 8.1 Configu ... -
OpenJPA (4)
2008-03-11 23:27 71226 Query 6.1 JPQL Queries 6.1. ... -
OpenJPA (3)
2008-03-09 23:09 52704 EntityManagerFactory 4.1 Ove ... -
OpenJPA (2)
2008-03-05 23:59 73023 Metadata 通过javax.persist ... -
OpenJPA (1)
2008-03-04 23:11 68911 Overview Apache OpenJPA是 ... -
ActiveMQ in Action (7)
2008-02-27 14:33 126822.6.7 Wildcards Wil ... -
ActiveMQ in Action (6)
2008-02-26 15:22 138052.6 Features ActiveMQ包含了很多 ... -
ActiveMQ in Action (5)
2008-02-26 00:35 136122.5 Clustering ActiveMQ从多种 ... -
ActiveMQ in Action (4)
2008-02-26 00:21 112932.4 Security ActiveMQ ... -
ActiveMQ in Action (3)
2008-02-26 00:16 106422.3 Persistence 2.3.1 AMQ Mess ... -
ActiveMQ in Action (2)
2008-02-25 23:58 132982.2 Transport ActiveMQ目前支持 ... -
ActiveMQ in Action (1)
2008-02-25 23:18 238971 JMS 在介绍ActiveMQ ...
相关推荐
5. **配置文件**:在`persistence.xml`文件中配置OpenJPA,包括数据源、实体管理工厂、实体类等信息。 6. **Web层**:创建Servlet或Controller(如`UserServlet.java`)来处理HTTP请求,调用DAO层的方法进行业务...
默认情况下,当应用程序第一次获取实体标识时,OpenJPA 框架从数据库中一次性获取 50 个连续的实体标识缓存起来,当下一次应用程序需要获取实体标识时,OpenJPA 将首先检测缓存中是否存在实体标识,如果存在,Open...
OpenJPA OpenJPA 是 Apache 组织提供的开源项目,它实现了 EJB 3.0 中的 JPA 标准,为开发者提供功能强大、使用简单的持久化数据管理框架。OpenJPA 封装了和关系型数据库交互的操作,让开发者把注意力集中在编写...
OpenJPA,全称Open Java Persistence API,是Apache软件基金会的一个开源项目,它实现了Java持久化API(Java Persistence API,JPA),为Java开发者提供了一种标准的方式来管理和持久化应用程序中的对象。...
**Spring和OpenJPA集成详解** 在Java世界中,Spring框架和OpenJPA(Open Java Persistence)是两个非常重要的组件。Spring作为一个全面的轻量级应用框架,提供了大量的功能,包括依赖注入、AOP(面向切面编程)、...
OpenJPA2是一个开源的对象关系映射(ORM)框架,它是Java Persistence API(JPA)规范的实现。在这个“Open JPA2 employee简单例子”中,我们将深入理解如何使用OpenJPA2来处理数据库中的员工数据。这个示例将帮助...
OpenJPA(Java Persistence API)则是Java平台上的一个ORM(对象关系映射)工具,它实现了JSR-317规范,使得开发者可以方便地在Java应用程序中操作数据库。本篇将详细讲解如何在Spring项目中集成并使用OpenJPA。 ...
OpenJPA(Open Java Persistence API)是Apache软件基金会下的一个开源项目,它是Java持久层标准JPA(Java Persistence API)的一个实现。JPA是Java EE平台中的一个重要组件,用于管理和处理应用程序中的对象-关系...
**JSF与OpenJPA整合** 涉及到在JSF应用中使用OpenJPA进行数据访问。这通常包括配置OpenJPA的数据源、实体管理器工厂,以及在JSF Managed Beans中注入实体管理器,以便在处理用户请求时执行CRUD操作。JSF的事件驱动...
5. **元数据源**:OpenJPA可以从多种来源读取元数据,包括注解、XML配置文件、库扫描等。这为灵活的配置提供了可能,开发者可以根据项目需求选择最适合的元数据源。 6. **性能优化**:OpenJPA提供了多种性能优化...
### OpenJPA官方手册知识点概览 #### 一、引言 - **OpenJPA**:作为Apache项目的一部分,OpenJPA是一个开源的Java持久化框架(Java Persistence Framework),它支持Java Persistence API (JPA) 的规范。OpenJPA...
安装OpenJPA的步骤通常包括下载OpenJPA的jar文件,将其添加到服务器的类路径中,并在服务器配置中指定OpenJPA作为默认的持久化提供者。 接下来,我们需要创建一个JPA项目。这涉及定义实体类,这些类代表数据库中的...
Spring MVC和OpenJPA是Java开发中常用的两个框架,它们分别在Web应用和持久层处理上发挥着重要作用。Spring MVC是Spring框架的一部分,用于构建高效、灵活的Web应用程序,而OpenJPA则是一个实现了Java Persistence ...
OpenJPA API 文档 chm格式
### Apache OpenJPA 2.1 用户指南:Java Persistence API 的深入解析 #### 一、简介 Apache OpenJPA 2.1 是基于 Sun Microsystems 的 Java Persistence 2.0 API (JSR-317 JPA 2.0) 规范实现的一种透明持久化 Java ...
Apache OpenJPA-自述文件 前言 感谢您下载此版本的Apache OpenJPA。 Apache OpenJPA是Java Persistence API规范的实现。 执照 此存储库的内容已根据Apache License 2.0 许可 更多信息 可以在openjpa-project子目录...
### OpenJPA-Manual 关键知识点解析 #### 一、OpenJPA介绍 **1.1 关于本文档** 本文档旨在提供一个全面且深入的指南,帮助开发人员理解和掌握Java Persistence API(JPA)的核心概念及其在Apache OpenJPA中的实现...
Openjpa2.2+Mysql+Maven+Servlet+JSP 博客源码: http://blog.csdn.net/shenhonglei1234/article/details/10394379
5. **查询语言JPA QL(Java Persistence Query Language)**:OpenJPA支持一种类似SQL的查询语言,用于检索、更新和删除数据,这使得开发者无需直接编写SQL语句。 6. **性能优化**:OpenJPA提供了一系列的性能调优...