- 浏览: 240084 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
akka_li:
学习了!但是为什么后续的没有了?!
EJB4:RMI和RMI-IIOP -
springaop_springmvc:
apache lucene开源框架demo使用实例教程源代码下 ...
Lucene学习笔记(一)Lucene入门实例 -
qepipnu:
求solr 客户端 jar包
Solr学习笔记(三)Solr客户端开发实例 -
zhangbc:
是这问题,赞!
Oracle Start Up 2 Oracle 框架构件、启动、解决一个问题 -
feilian09:
查询 select hibernate jdbc 那个效率快
Hibernate,JDBC性能探讨
好久没有写博客了,最近比较忙,今天抽时间写点,最近的工作都是围绕EJB及JBoss的,所以这篇博客还是EJB相关。
我们知道EJB环境下Session Bean(两种状态)中可以直接使用EntityManager,使用时只需对EntityManager加一个Annotation(EJB 3)即可,如下:
@PersistenceContext(unitName="com.xxx.xxx.po") EntityManager em=null;
EJB Container看到PersistenceContext标记是会自动初始化EntityManager,在Session Bean中需要对com.xxx.xxx.po包下面的Entity类进行处理时直接可以用em既可。而实际工作中往往想在自己的代码中控制使用EntityManager,本文就是基于在J2Se环境下使用EntityManager处理POJO类完成对数据库的update。
直接写一个简单Demo:
项目Eclipse下截图:
从下向上,说明:
1 所需Jar包如图中,Jar包添加花了我好多时间,主要是Hibernate相关jar
2 oracle.properties定义数据库连接信息,如下;
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect #connection hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver hibernate.connection.username=IPC113 hibernate.connection.password=bpm hibernate.connection.url=jdbc:oracle:thin:@//192.168.68.120:1521/orcl #pool hibernate.c3p0.min_size=1 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=1800 hibernate.c3p0.max_statements=50
如上显示连接Oracle数据库,用户名IPC113,密码bpm连接URL及数据库池等
3 hibernate.cfg.xml 本来可以不要,但是我不知道用EntityManager直接产生初始化表,我知道是可以产生,但暂时用Hibernate产生初始化表
配置:
<?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> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@192.168.68.120:1521:orcl</property> <property name="connection.username">ipc113</property> <property name="connection.password">bpm</property> <property name="dialect">org.hibernate.dialect.OracleDialect</property> <property name="connection.pool_size">1</property> <property name="current_session_context_class">thread</property> <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping class="com.kylin.study.po.Person"/> <mapping class="com.kylin.study.po.Husband"/> <mapping class="com.kylin.study.po.Wife"/> </session-factory> </hibernate-configuration>
4 persistence.xml,Persistence 提供者配置信息
如下:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="com.kylin.study.po" > <provider>org.hibernate.ejb.HibernatePersistence</provider> <properties> <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> <property name="hibernate.ejb.classcache.com.kylin.study.po.Person" value="read-write"/> <property name="hibernate.ejb.classcache.com.kylin.study.po.Husband" value="read-write"/> <property name="hibernate.ejb.classcache.com.kylin.study.po.Wife" value="read-write"/> </properties> </persistence-unit> </persistence>
5 POJO类,此处用到一对一单向映射的例子,前面http://kylinsoong.iteye.com/blog/739502中第二部分第一个Husband和Wife例子。
代码:
package com.kylin.study.po; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Entity @Table(name="t_husband") public class Husband { private int id; private String name; private Wife wife; @Id @GeneratedValue 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; } @OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="wifeId") public Wife getWife() { return wife; } public void setWife(Wife wife) { this.wife = wife; } }
package com.kylin.study.po; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="t_wife") public class Wife { private int id; private String name; @Id @GeneratedValue 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; } }
package com.kylin.study.po; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="t_person") public class Person { private int id; private String name; @Id @GeneratedValue 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; } }
6。测试代码:
package com.kylin.study.jpa; import java.io.IOException; import java.io.InputStream; import java.util.List; import java.util.Properties; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.persistence.Query; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.junit.BeforeClass; import org.junit.Test; import com.kylin.study.po.Husband; import com.kylin.study.po.Person; import com.kylin.study.po.Wife; public class JPAJ2SETest { private static EntityManager em ; @BeforeClass public static void beforeClass() { String persistence_unit = "com.kylin.study.po"; Properties prop = new Properties(); InputStream is = JPAJ2SETest.class.getClassLoader().getResourceAsStream("oracle.properties"); try { prop.load(is); } catch (IOException e) { e.printStackTrace(); } finally { try { if(is != null) is.close(); } catch (IOException ignored) { } } EntityManagerFactory emf = Persistence.createEntityManagerFactory(persistence_unit, prop); em = emf.createEntityManager(); } @Test public void createTestTables() { new SchemaExport(new AnnotationConfiguration().configure()).create(true, true); } @Test public void save() { EntityTransaction t = em.getTransaction(); t.begin(); Person kobe = new Person(); kobe.setName("Kobe Bryant"); Person vanessa = new Person(); vanessa.setName("Vanessa Bryant"); em.persist(kobe); em.persist(vanessa); t.commit(); } @Test public void query() { EntityTransaction t = em.getTransaction(); t.begin(); String str = "Kobe Bryant"; Query query = em.createQuery("from Person where name='" + str + "'"); List<Person>lists = query.getResultList(); for(Person p : lists) { System.out.println(p.getId() + " " + p.getName()); } t.commit(); } @Test public void find() { EntityTransaction t = em.getTransaction(); t.begin(); Object obj = em.find(Person.class, 1); t.commit(); System.out.println(obj); } @Test public void delete() { EntityTransaction t = em.getTransaction(); t.begin(); Object obj = em.find(Person.class, 1); em.remove(obj); t.commit(); } @Test public void one2Onesave() { EntityTransaction t = em.getTransaction(); t.begin(); Husband kobe = new Husband(); kobe.setName("Kobe Bryant"); Wife vanessa = new Wife(); vanessa.setName("Vanessa Bryant"); kobe.setWife(vanessa); em.persist(kobe); t.commit(); } @Test public void one2Onequery() { EntityTransaction t = em.getTransaction(); t.begin(); Query query1 = em.createQuery("from Husband"); List<Husband> husbands = query1.getResultList(); for(Husband h : husbands) { System.out.println(h.getId() + " " + h.getName() + " " + h.getWife().getId() + " " + h.getWife().getName()); } Query query2 = em.createQuery("from Wife"); List<Wife> wifes = query2.getResultList(); for(Wife w : wifes) { System.out.println(w.getId() + " " + w.getName()); } t.commit(); } @Test public void one2Onefind() { EntityTransaction t = em.getTransaction(); t.begin(); Husband kobe = em.find(Husband.class, 21); System.out.println(kobe.getId()); System.out.println(kobe.getName()); System.out.println(kobe.getWife().getId()); System.out.println(kobe.getWife().getName()); t.commit(); } @Test public void one2Onedelete() { EntityTransaction t = em.getTransaction(); t.begin(); Husband kobe = em.find(Husband.class, 21); em.remove(kobe); Query query2 = em.createQuery("from Wife"); List<Wife> wifes = query2.getResultList(); for(Wife w : wifes) { System.out.println(w.getId() + " " + w.getName()); } t.commit(); } public static void main(String[] args ) { // JPAJ2SETest test = new JPAJ2SETest(); // JPAJ2SETest.beforeClass(); // test.save(); } }
依次向下执行测试类方法:
(1)createTestTables()执行完后,数据库中产生了三张表,如下:
(2)save()向数据库中存入两个Person,Kobe和他老婆
(3)query()可以查看数据库中所有名字是Kobe Bryant的人,执行结果:
1 Kobe Bryant 3 Kobe Bryant
(4)find()查找一个Person对象,id为1,执行结果
com.kylin.study.po.Person@16ea269
(5) delete()删除一个id为1Person对象;
(6)one2Onesave()同样存储一个一对一的对象,同样是Kobe和他老婆
(7)one2Onequery()查询刚插入的数据,主要验证,一对多单向可以用一方获取另一方,执行结果:
21 Kobe Bryant 22 Vanessa Bryant 22 Vanessa Bryant
(8)one2Onefind()查找id为21的丈夫,执行结果:
21 Kobe Bryant 22 Vanessa Bryant
(9)one2Onedelete()删除id为21的Husband,主要验证删除Husband后相关的Wife也删除
到此例子结束,有好多问题,比如,如何直接用JPA API生成表等,值得去研究,由于时间不说写……
发表评论
-
Oracle - Add Exist Validation Before Create Table
2011-11-07 13:49 1455Usually we need to check the ta ... -
JMX Architecture & "Hello Word" the JMX way
2011-10-25 20:07 1813JMX Architecture Overview: JMX ... -
Jboss-eap-5.1 Messaging
2011-08-02 21:50 2473This section I will concertate ... -
Jboss-eap-5.1 starting up note
2011-07-26 22:46 2584Jboss enterprise platform 5 hav ... -
EJB Security & JAAS Demo
2011-05-21 19:39 1615PROLOGUE: When deploying ... -
JBoss LoginInitialContext Factory Implementation
2011-05-15 16:05 1533Jboss has a series of imp ... -
Jboss Reference Exception Gallery
2011-04-27 14:08 28901. Unable to locate a login con ... -
Hibernate Annotation 的一个问题,给点意见
2011-03-10 12:43 22问题:org.hibernate.annotations. ... -
大家说说BBC的网站用的是什么技术做的
2011-02-22 05:01 1438最近在英国出差,发现这里的一些网站做的相当有特色,有些网站不是 ... -
Hibernate OneToMany 单向和双向配置对数据存取性能的比较
2011-02-08 17:06 23161. 开篇说明:今天是春 ... -
对Hibernate属性(CascadeType、JoinColumn、JoinTable、ForeignKey等)的研究
2010-12-26 15:45 16672本文列出几个“EJB 学习阶段总结:JBoss下发布一个Toy ... -
EJB 学习阶段总结:JBoss下发布一个Toy企业应用
2010-12-25 12:11 2632解释题目:为什 ... -
EJB7: Message Driven Bean
2010-12-21 22:42 2147在企业系统中需要使用 ... -
EJB6: EntityBean例子
2010-11-26 14:48 1493本例子描述向EJB容器(JBoss)部署http: ... -
JPA dev: 几个问题总结(续)
2010-11-25 18:02 24732. 如何由PoJo类生成数据库中的表 首先可以根据实体间关 ... -
JPA dev: 几个问题总结
2010-11-25 16:56 3404最近工作中遇到几个与JPA相关的问题,本文通过一个例子总结一下 ... -
JAXB学习
2010-11-24 22:35 01 什么是JAXB? JAXB全称Java Ar ... -
EJB4:RMI和RMI-IIOP
2010-11-02 21:14 4135计划提纲:引入→RMI概念→RMI HelloWorld程序→ ... -
EJB3: JBOSS 企业版、JBOSS服务器构架、EJB2.0 HelloWrold实例
2010-10-26 22:43 6472本文的研究基于jboss-eap- ... -
jboss-eap-4.3 启动停止在Configuring from URL: resource:jboss-log4j.xml 问题
2010-10-25 14:49 4052如题,我改用jboss-eap-4.3, 启动时停止在Conf ...
相关推荐
1. EJB Core (ejb-3_0-fr-spec-ejbcore.pdf): EJB Core涵盖了EJB的基础架构,包括会话bean(Session Beans)、实体bean(Entity Beans)和消息驱动bean(Message-Driven Beans)。在EJB 3.0中,主要引入了注解驱动...
结合使用,它们可以构建出复杂、可扩展且易于维护的系统。对于初学者来说,掌握这四者将极大地提升在Java EE领域的专业能力。在学习过程中,可以逐步理解每个技术的原理,然后通过实践将它们整合到一个项目中,以...
* 在 J2SE 环境中获取 EntityManager * 在 EJB 容器中获取 EntityManager 容器托管的实体管理器: * 事务范围的 EntityManager * 可扩展的 EntityManager 事务范围的 EntityManager: * 使用 @...
- JPA扩展API和第三方工具集成。 - **关键知识点:** - JPA 2.1的新增功能。 - 复杂查询的设计方法。 - 性能调优的最佳实践。 - 第三方JPA实现的选择。 ##### 5. 第5章:消息驱动Bean - **主要内容:** - ...
《经典Java EE企业应用实战:基于WebLogic/JBoss的JSF+EJB 3+JPA整合开发》介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun公司提供的JSF RI;EJB 3部分则包含Session Bean、Message Driven Bean的...
6. **ejb-3_0-pfd-spec-persistence.pdf**:这份文档主要关注EJB 3.0的持久化特性,详细阐述了JPA的使用、查询语言(JPQL)和实体关系映射等。 7. **ejb-3_0-pfd-spec-simplified.pdf**:这份文档重点讲解EJB 3.0的...
经典JAVA EE企业应用实战基于WEBLOGIC JBOSS的JSF+EJB 3+JPA整合开发——源码.part1 其他部分详见我的上传列表,全部分卷下载完成才能解压。 本书介绍了Java EE规范的三大主要规范JSF、EJB 3和JPA,其中JSF是Sun...
**基于JSF+EJB3+JPA的竞价拍卖系统** 在IT行业中,开发一个拍卖系统是一项复杂的任务,它需要高效、稳定且用户友好的技术栈。"基于JSF+EJB3+JPA的竞价拍卖系统"是利用Java企业级技术构建的这样一个系统,主要依赖于...
结合**JavaSe(Java Standard Edition)**,EJB 3.0和JPA可以在非服务器环境中运行,这大大扩展了它们的应用场景。JavaSe提供了基础的Java运行环境,支持开发桌面应用程序和服务端应用程序。在JavaSe环境下,开发者...
本篇文章将深入探讨ejb3与JPA的关系,以及如何在实际项目中使用它们。 ### JPA概述 Java Persistence API是Java EE平台的一部分,它提供了一套标准API,用于在Java应用程序中实现ORM。JPA允许开发者使用面向对象的...
本篇内容将基于提供的文件信息——“ejb-3_0-fr-spec-persistence.pdf”进行深入分析,探讨EJB 3.0中的关键概念和技术要点。 #### 核心概念 1. **EJB 3.0简介**: - EJB 3.0是EJB技术的一个重要里程碑,它在保留...
J2ME由配置(Configurations)和框架(Profiles)组成,其中配置定义了基本的Java运行环境,而框架则根据特定设备的功能扩展配置。例如,MIDP(Mobile Information Device Profile)是用于移动设备的应用程序开发,...
在EJB(Enterprise JavaBeans)框架中,JPA被广泛使用,提供了一种面向对象的方式来处理数据库交互。本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将...
- 在Java EE 5之后,实体Bean被**Java Persistence API (JPA)**所取代。 3. **消息驱动Bean (Message Driven Bean):** - 处理来自消息队列的消息,支持异步通信。 #### 三、EJB生命周期 每种类型的EJB都有其...
EJB.JPA-数据库持久层开发实践详解,感兴趣的人可以阅读一次
【EJB学习大全】是针对企业级Java应用开发的一个重要主题,主要涵盖了EJB3.0、JPA教程以及实战EJB的相关知识。EJB,全称为Enterprise JavaBeans,是Java平台上的一个核心组件,主要用于构建分布式、面向服务的企业级...