- 浏览: 69641 次
- 性别:
- 来自: 海南-临高
最新评论
声明以下目录结构摘自红工场:http://www.redsoftfactory.com/chinese/ejb3/docs/zh/ref/index.html
看目录回顾所学的知识:
EJB3 Persistence开发手册
1. EJB3 Persistence API介绍
1. 为什么要引入EJB3
2. EJB 3和EJB 2.1的区别
3. EJB 3中的元数据批注:Annotation
2. 第一个Entity Bean:HelloWorld
3. 解说Entity
1. 定义对Entity中属性的访问
2. 主键和实体标识(Primary Key and Entity Identity)
4. 操作Entity
1. 配置和获得EntityManager
2. Entity的生命周期和状态
3. 持久化Entity
4. 获取Entity
5. 更新Entity
6. 删除Entity
7. 分离/附合(Detach/Merge)
5. EJB3 QL查询
1. Query接口
2. 简单查询
3. 使用参数查询
4. 排序(order by)
5. 查询部分属性
6. 查询中使用构造器(Constructor)
7. 聚合查询(Aggregation)
8. 关联(join)
1 left join/left out join
2 inner join
3 left/inner join fetch
9. 比较Entity
10. 批量更新(Batch Update)
11. 批量删除(Batch Remove)
12. 使用操作符NOT
13. 使用操作符BETWEEN
14. 使用操作符IN
15. 使用操作符LIKE
16. 使用操作符IS NULL
17. 使用操作符IS EMPTY
18. 使用操作符EXISTS
19. 使用操作符ALL/SOME/ANY
20. 字符串函数
21. 计算函数
22. 子查询
6. 原生SQL查询(Native SQL)
7. 关系/对象映射
1. 一对一映射
2. 一对多映射
3. 多对多映射
4. 继承
8. 关系对象映射元数据
1. Table
2. SecondaryTable
3. SecondaryTables
4. UniqueConstraint
5. Column
6. JoinColumn
7. JoinColumns
8. Id
9. IdClass
10. MapKey
11. OrderBy
12. PrimaryKeyJoinColumn
13. PrimaryKeyJoinColumns
14. Transient
15. Version
16. Lob
17. JoinTable
18. TableGenerator
19. SequenceGenerator
20. DiscriminatorColumn
21. DiscriminatorColumn
知识片断:
采用EJB架构的目标在于:
数据对象生命周期的自动管理
分布式能力
集成/声明式的安全/事务管理
EJB 3.0 旨在解决以往EJB 2.0 模型的复杂性和提高灵活性,具体体现在:
消除了不必要的接口Remote, Home, EJB以及回调方法实现
实体Bean采用了POJO模型,一个简单的java bean就可以是一个Entity Bean。无需依赖容器运行和测试
灵活丰富的EJB3查询语言
SQL支持
使用元数据批注代替部署描述符,减少复杂配置和提高可维护性
将常规 Java 类用作 EJB 并将常规业务接口用于 EJB
采用元数据可以很好的解决这些问题:
描述符大量减少。
编译期校验。错误的批注在编译期间就会报错。
元数据被编译成java bytecode,消耗小的多内存,读取也非常迅速,往往比xml配置解析快几个数据量级,利于测试和维护
// 获得默认当前的EntityManagerFactory
final EntityManagerFactory emf = Persistence.createEntityManagerFactory();//搜索当前jar包的persistence.xml配置文件,来初始化EntityManagerFactory
final EntityManager entityManager = emf.createEntityManager();
在EJB3中定义了四种Entity的状态:
新实体(new)。Entity由应用产生,和EJB3 Persistence运行环境没有联系,也没有唯一的标示符(Identity)。
持久化实体(managed)。新实体和EJB3 Persistence运行环境产生关联(通过persist(), merge()等方法),在EJB3 Persistence运行环境中存在和被管理,标志是在EJB3 Persistence运行环境中有一个唯一的标示(Identity)。
分离的实体(detached)。Entity有唯一标示符,但它的标示符不被EJB3 Persistence运行环境管理, 同样的该Entity也不被EJB3 Persistence运行环境管理。
删除的实体(removed)。Entity被remove()方法删除,对应的纪录将会在当前事务提交的时候从数据库中删除。
如果知道Entity的唯一标示符,我们可以用find()方法来获得Entity。
Father father = manager.find( Father.class, new Integer( 1 ) );
// 由于JDK1.5支持自动转型,也可以如下使用
Father father = manager.find( Father.class, 1 );
对Entity的更新必须在事物内完成。和persist中一样,关系元数据的cascade属性对是否集联删除有影响。
transaction.begin();
Father father = manager.find( Father.class, 1 );
// 更新原始数据类型
father.setName( "newName" );
// 更新对象引用
Son newSon = new Son();
father.setSon( newSon );
// 提交事务,刚才的更新同步到数据库
transaction.commit();
对Entity的删除必须在事物内完成。
transaction.begin();
Father father = manager.find( Father.class, 1 );
// 如果father/son的@OneToOne的cascade=CascadeType.ALL,在删除father时候,也会把son删除。
// 把cascade属性设为cascade=CascadeType.REMOVE有同样的效果。
manager.remove( father );
// 提交事务,刚才的更新同步到数据库
transaction.commit();
在三层或者分布式应用中,我们很多时候需要Entity能脱离EntityManager,避免长时间保持EntityManager打开占用资源和可以在不同的JVM之间传递Entity。
EntityManager entityManager = emf.createEntityManager();
// 这时Father还是被EntityManager管理的
Father father = manager.find( Father.class, 1 );
// 当entityManger关闭的时候,当前被entityManager管理的Entity都会自动的脱离EntityManager,状态转变为detached
entityManager.close();
// 脱离EntityManager后,我们仍然可以修改Father的属性
father.setName( "newName" );
// 在稍后的,我们可以将father重新附和到一个新的或者原来的EntityManager中
EntityManager newEntityManager = emf.createEntityManager();
// 附合( merge )需要在事务中进行
newEntityManager.getTransaction().begin();
newEntityManager.merge( father );
// commit后father中的被修改的内容会同步到数据库。
newEntityManager.getTransaction().commit();
需要注意的是在脱离EJB3 Persistence Runtime的管理后,如果对象中有定义为lazy-load的属性将无法访问。
EJB3 QL查询
在程序中使用EJB3 QL可以使用大写(SELECT)或者小写(select),但不要大小写(比如:Select)混合使用。
有时候查询会返回海量的数据。Liberator EJB3运行环境采用了自适应的弱引用POJO管理机制,可以处理海量的数据。在我们的测试中和客户的环境可以处千万级别的数据量。但在处理大数据量的时候,注意关闭对集合结果的缓存。
// 假设返回的结果数量巨大
final Query query = entityManager.createQuery( "select o from Order o");
// 关闭对查询结果的缓存
query.setHint( Constants.QUERY_RESULT_CACHE, "false");
final List result = query.getResultList();
final Iterator iterator = result.iterator();
// 这里我们可以处理海量的数据
while( iterator.hasNext() ){
// 处理Order
}
使用参数查询:
EJB3 QL支持两种方式的参数定义方式: 命名参数和位置参数
命名参数:
final Query query = entityManager.createQuery( "select o from Order o where o.id = :myId");
// 设置查询中的参数
query.setParameter( "myId", 2 );
// 可以使用多个参数
final Query query = entityManager.createQuery( "select o from Order o where o.id = :myId and o.customer = :customerName" );
// 设置查询中的参数
query.setParameter( "myId", 2 );
query.setParameter( "customerName", "foo" );
注意不允许在同一个查询中使用两个相同名字的命名参数。
位置参数:
final Query query = entityManager.createQuery( "select o from Order o where o.id = ?1");
// 设置查询中的参数
query.setParameter( 1, 2 );// 1表示第一个参数,2是参数的值
//或者
final Query query = entityManager.createQuery( "select o from Order o where o.id = ?1").setParameter( 1, 2 );
// 可以使用多个参数
final Query query = entityManager.createQuery( "select o from Order o where o.id = ?1 and o.customer = ?2" );
// 设置查询中的参数
query.setParameter( 1, 2 );
query.setParameter( 2, "foo" );
如果在未来需要在不同的EJB3 运行环境中运行,请使用位置参数,保证应用是可移植的。
查询部分属性:
// 直接查询我们感兴趣的属性(列)
final Query query = entityManager.createQuery( "select o.id, o.customerName, o.address.streetNumber from Order o order by o.id");
// 集合中的不再是Order,而是一个Object[]对象数组
final List result = query.getResultList();
// 第一个行
Object[] row = result.get( 0 );
// 数组中的第一个值是id
int id = Integer.parseInt( row[0].toString() );
String customerName = row[1].toString();
String streetNumber = Integer.parseInt( row[2].toString() );
关联(join):
在EJB3 QL中,大部分的情况下,使用对象属性都隐含了关联(join)。例如在以下查询中:
final Query query = entityManager.createQuery( "select o from Order o
where o.address.streetNumber=2000 order by o.id");
当这个句EJB3 QL编译成以下的SQL时就会自动包含了关联,EJB3 QL编译成SQL时关联默认取左关联(left join)。
select o.id, o.vender, o.partNumber, o.amount, addressTable.id, addressTable.streetNumber
from orderTable as o left join addressTable where addressTable.streetNumber = 2000
但在一些情况下,我们仍然需要对关联做精确的控制。因此EJB3 QL仍然支持和SQL中类似的关联语法:
left out join/left join
inner join
left join/inner join fetch
原生SQL查询:
EJB3 QL对原生SQL做了非常好的支持。采用原生SQL做查询结果不但可以是象SQL中的返回列值,也可以是Entity类,甚至可以是两者的混合。
EJB3 EntityManager接口定义了多个原生SQL的产生方法。
public Query createNativeQuery(String sqlString);
public Query createNativeQuery(String sqlString, Class resultClass);
public Query createNativeQuery(String sqlString, String resultSetMapping);
一个简单的SQL查询:
Query query = entityManager.createNativeQuery("select o.id, o.vender as vender from OrderTable");
// 集合中的每个元素是一个数组,代表一行返回列值,每一个数具有2个元素,分别是id列,vender列
List result = query.getResultList();
Object[] row1 = (Object[])result.get(0);
在原生SQL中使用参数和EJB3 QL中使用参数的方法一致,但只支持位置参数。
Query query = entityManager.createNativeQuery("select o.id, o.vender as vender from OrderTable where o.id = ?1");
query.setParameter( 1, 200 );
// 集合中的每个元素是一个数组,代表一行返回列值,每一个数具有2个元素,分别是id列,vender列
List result = query.getResultList();
Object[] row1 = (Object[])result.get(0);
除了象上面例子中直接返回查询结果的列值,我们可以让EJB3 Persistence运行环境将列值直接填充入一个Entity的实例,并将实例作为结果返回。
// 我们这里将结果定义为Entity类Order的实例
Query query = entityManager.createNativeQuery("select o.id, o.vender, o.partId from OrderTable o order by o.amount desc", Order.class);
// 结果集合中是Order类的实例,但Order实例只有id, vender, partId三列对应的属性变量有值,其他的变量属性为空。
List result = query.getResultList();
Order order1 = (Order)result.get( 0 );
关系对象映射元数据
元数据描述:
@OneToOne(optional = true,cascade = CascadeType.ALL, mappedBy = "country")
optional声明关系是否是必须存在的,即是否允许其中一端为null。
cascade声明级联操作。
@JoinColumn(name = "COUNTRY_ID", referencedColumnName = "id")
name声明外键列的名字,referencedColumnName声明外键指向列的列名。
元数据描述:
@OneToMany(targetEntity = Child.class, cascade = CascadeType.ALL, mappedBy = "father")
targetEntity = Child.class表明关系另一端的实体类型
cascade声明级联操作。
mappedBy声明关系维护端的字段(field)名。
@ManyToOne
@JoinColumn(name = "FATHER_ID", referencedColumnName = "id")
name声明外键列的名字,referencedColumnName声明外键指向列的列名。
元数据描述:
@ManyToMany(targetEntity = Student.class, cascade = CascadeType.PERSIST)
targetEntity = Student.class表明关系另一端的实体类型。cascade声明级联操作。
@JoinTable(table = @Table(name = "M2M_TEACHER_STUDENT"),
joinColumns = @JoinColumn(name = "TEACHER_ID", referencedColumnName = "ID"),
inverseJoinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID"))
JoinTable配置中间表信息,它由3个部分组成:
1) table = @Table(name = "M2M_TEACHER_STUDENT") ,声明中间表的名字
2) joinColumns ,定义中间表与关系维护端的外键关系。
3) inverseJoinColumns,定义中间表与inverse端的外键关系.
基类中元数据描述:
@Inheritance(strategy=InheritanceType.SINGLE_TABLE,
discriminatorType=DiscriminatorType.STRING,discriminatorValue="employee")
strategy=InheritanceType.SINGLE_TABLE表示继承映射采用第一种映射策略。
discriminatorType=DiscriminatorType.STRING表示继承层次中类型识别列类型为String.
discriminatorValue="employee" 表示此类对应的类型识别码为employee.
发表评论
-
”懒人“通用快捷键
2007-11-02 22:19 1273通用快捷键: 查找: ctlr ... -
《正规表达式》笔记1
2007-10-16 21:48 2960js 代码 以前正规表达式的学习笔记: ... -
web开发中如何调试ajax(图解全过程)
2007-08-16 21:15 4405在web开发过程中,一般都会用junit的TestCase ... -
在web开发应用中实现带有分页,导出及打印功能的实例(jasper报表开发)
2007-08-11 14:35 3956使用ireport工具可以design一个报表(简易报表,交 ... -
建模学习例子
2007-07-25 09:48 3328在项目协作中,建模工具起到了非同寻常的作用。 可以使项目管理员 ... -
web开发中Velocity的应用
2007-07-24 21:30 9693跟大学同学从去年开始一起搞的softecase项目差不多完成了 ... -
case_jsp2
2007-07-24 08:22 1757昨天将以前在开发中经常使用的case_jsp2温习了一遍。以 ... -
参考appfuse学习实例
2007-07-23 18:13 1819工作两年了。最近回顾了一下自己当初学习时,制作的demo(st ... -
HIbernate学习笔录1
2007-07-20 08:10 1140去年年初的时候,买了 ... -
swing E版
2007-07-19 22:27 1308两年没有碰过swing了。昨晚跟同学聊了一会。问我现在还在用s ... -
webwork in action(源码)
2007-07-19 11:26 53介绍技术点: OS(OpenSymphony)的SiteMes ... -
使用模式设计及java5新特性在HibernateDAO中的应用
2007-07-18 15:01 1290"冻迷"看图猜猜是用的哪种设计模式及jav ... -
新手入门必看的30个问题!!!!!! (引用篇)
2007-07-18 13:43 20想要了解更多吗?想的 ... -
j2ee架构师认证指南笔录2
2007-07-14 13:40 1175虽然80端口是http的默认端口,但是http可以根据需要在任 ... -
j2ee架构师认证指南笔录1
2007-07-14 13:40 1377体系结构是将一系列具 ...
相关推荐
WebLogic EJB学习笔记主要涵盖了企业级Java Bean(Enterprise JavaBeans,简称EJB)在Oracle WebLogic Server中的应用和管理。EJB是Java EE(Java Platform, Enterprise Edition)平台的核心组件,用于构建可扩展、...
### EJB学习笔记第六部分详解 #### 一、EJB之间的调用 EJB (Enterprise JavaBeans) 是Java EE平台中用于开发分布式企业应用程序的重要组件。在实际开发过程中,经常需要一个EJB调用另一个EJB来实现更复杂的业务...
在深入探讨《ejb学习笔记》这一主题之前,我们首先需要理解什么是EJB(Enterprise JavaBeans)。EJB是Java平台为企业级应用开发提供的一套组件模型,它属于J2EE(Java 2 Platform, Enterprise Edition)的一部分,...
Weblogic EJB 学习笔记主要涵盖了EJB(Enterprise JavaBeans)的基础知识,包括无状态会话bean、有状态会话bean和实体bean这三种主要的EJB类型,以及EJB在Weblogic服务器中的配置和事务管理。 1. **无状态会话bean*...
【EJB学习笔记】 EJB,全称为Enterprise Java Beans,是Java平台上的一个标准,用于开发和部署服务器端的分布式组件。它基于Java语言,为创建高效能、安全且可扩展的企业级应用提供了框架。EJB规范由Java ...
【EJB学习笔记2】 EJB,全称Enterprise JavaBeans,是Java EE(现在被称为Jakarta EE)平台的一部分,主要用于构建可复用的、安全的、可伸缩的服务器端应用程序。EJB标准定义了一组规范,使得开发者可以创建分布式...
【EJB学习笔记、运行机制】 企业级程序(Enterprise Application)是围绕商业目的设计的,具有分布分层的程序架构。这种类型的程序旨在满足大型企业的复杂需求,通常涉及多个组件和层,确保系统的稳定性和可扩展性...
以及两本外文pdf书籍及源码,分别为ejb-3_0-fr-spec-persistence.pdf和ejb-3_0-fr-spec-simplified.pdf,以及EJB课堂笔记.doc和EJB基础.chm、EJB学习笔记.doc,是初学者理想的学习资料。
从最初的EJB 1.0到EJB 2.x,再到EJB 3.0,其复杂性和学习曲线逐渐降低。EJB 3.0引入了注解,极大地简化了代码,并且与JPA、JSF等其他Java EE技术更好地集成。最新的EJB 3.2版本继续优化了API,提高了开发效率。 **...
### EJB学习笔记4:深入理解实体与JPA #### 实体的概念与作用 实体,在企业级Java开发中,特别是EJB(Enterprise JavaBeans)框架下,指的是具有持久化能力的POJO(Plain Old Java Object)类。不同于实体Bean...
### 深入解析《ejb学习笔记5》——消息驱动Bean详解 #### 消息驱动Bean概述 消息驱动Bean(MDB,Message Driven Bean)是Enterprise JavaBeans(EJB)框架中的一个重要组成部分,主要用于接收并处理来自消息中间件...
### EJB学习笔记8:深入理解事务处理机制 #### 一、事务的背景知识 **事务**是指一系列操作,这些操作作为一个不可分割的工作单元来执行,即要么全部完成,要么完全不执行。事务的主要特性包括: - **原子性...
### EJB学习笔记7知识点详解 #### 实体(消息)- 重点篇章解析 ##### 继承映射策略深入理解 在实体继承映射中,我们主要探讨了三种不同的策略,每种策略都有其特定的应用场景及优缺点。 1. **所有继承结构一张表...
### 基于Weblogic的EJB学习笔记详解 #### EJB基础知识概览 ##### 1. 无状态会话Bean (Stateless Session Bean) 无状态会话Bean是一种不保存客户端会话状态的EJB组件。这意味着每个客户端的请求都不依赖于前一个...
【EJB学习笔记】 EJB(Enterprise JavaBeans)是Java EE平台的核心组成部分,主要用于构建分布式、面向服务的企业级应用程序。EJB技术旨在解决多层架构体系中的问题,尤其是在服务器端计算场景下的应用。 1. **...
本资料集包含了ejb培训笔记和源代码,旨在帮助学习者深入理解EJB的工作原理及其在实际项目中的应用。 笔记部分可能涵盖以下关键知识点: 1. **EJB概述**:介绍EJB的历史、版本和基本概念,包括EJB 2.x和EJB 3.x的...
经典资料+个人心得,希望大家能喜欢