- 浏览: 240696 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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)部署http://kylinsoong.iteye.com/blog/824676中描述的例子的全过程,链接博客中描述的例子包含7个实体:User、Event、Friend、Property、Pet、UserCard、Wife,其中:User和Event,User和Friend,Event和Property,Wife和Pet,Pet和Property关系为一对多关系;而User和UserCard,Friend和UserCard,Wife和UserCard,User和Wife之间的关系是一对一关系;
下面开始部署http://kylinsoong.iteye.com/blog/824676中描述的例子:
1 JBoss数据源的配置
数据源的备份文件可以在JBOSS_Home\docs\examples\jca下找到,我用的是Oracle10g所以我用到的JBoss数据源的配置JBOSS_Home\docs\examples\jca下的oracle-ds.xml,将oracle-ds.xml做一下修改,修改完拷贝到JBOSS_Home\server\production\deploy下,修改完的oracle-ds.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <datasources> <local-tx-datasource> <jndi-name>OracleDS</jndi-name> <connection-url>jdbc:oracle:thin:@192.168.68.120:1521:orcl</connection-url> <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> <user-name>***</user-name> <password>***</password> <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name> <metadata> <type-mapping>Oracle10g</type-mapping> </metadata> </local-tx-datasource> </datasources>
其中说明了JBoss数据源的jndi-name:OracleDS,jndi-name必须唯一;
连接URL:jdbc:oracle:thin:@192.168.68.120:1521:orcl
连接驱动名称:oracle.jdbc.driver.OracleDriver
以及数据库名称及密码,数据库类型;
拷贝完成后启动JBoss,http://localhost:8080/jmx-console/HtmlAdaptor?action=displayMBeans下jboss.jca可以看到刚才添加数据源的配置信息:
2 Bean开发
首先修改之前POJO实体,让其手实现java.io.Serializable接口,
其次用一个无状态Session Bean来控制Entity Bean
贴出Remote接口UserService和无状态SessionBean:UserServiceBean
public interface UserService { public void insertUser(User user); public void updateName(String newname, Long id); public void mergeUser(User user); public void deleteUser(Long id); public User getUserByID(Long id); public List<User> getUserList(); }
@Stateless @Remote(UserService.class) public class UserServiceBean implements UserService { @PersistenceContext(unitName="com.tibco.hibernate.po") protected EntityManager em; public void insertUser(User user) { em.persist(user); } public void updateName(String name, Long id) { User user = em.find(User.class, id); if(user != null){ user.setName(name); } } public void mergeUser(User user) { em.merge(user); } public void deleteUser(Long id) { User user = em.find(User.class, id); if(user != null){ em.remove(user); } } public User getUserByID(Long id) { return em.find(User.class, id); } public List<User> getUserList() { Query query = em.createQuery("select u from User as u"); return query.getResultList(); } }
如上:Remote接口UserService提供了一套对User的增删改查方法,无状态SessionBean类UserServiceBean分别提供了这些方法的一个实现。
@PersistenceContext(unitName="com.tibco.hibernate.po") 指定了Persistence unit的名字,容器通过这个名字可以找到相应的实体类和数据源等
3. persistence.xml编写
我们知道Persistence unit 是在persistence.xml中定义的,实体类型之所以能被EntityManager控制是因为提供了Persistence unit,根据持久化规范的要求,该描述文件是必须提供的,如果不提供这一文件,则Persistence unit也
将不存在,因此应用也不能够获得和使用EntityManager,下面是persistence.xml内容:
<?xml version="1.0"?> <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.tibco.hibernate.po"> <jta-data-source>java:/OracleDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="create-drop"/> <!-- 调整JDBC抓取数量的大小: Statement.setFetchSize() --> <property name="hibernate.jdbc.fetch_size" value="18"/> <!-- 调整JDBC批量更新数量 --> <property name="hibernate.jdbc.batch_size" value="10"/> <!-- 显示最终执行的SQL --> <property name="hibernate.show_sql" value="true"/> <!-- 格式化显示的SQL --> <property name="hibernate.format_sql" value="true"/> </properties> </persistence-unit> </persistence>
配置文件说明我们用的JPA的实现是Hibernate,“hibernate.hbm2ddl.auto”值得容器启动时创建表,容器关闭时删除表,"hibernate.show_sql"在容器Console口打印SQL语句,"hibernate.format_sql"说明在容器Console显示的SQL语句是格式化的;
4 将过程打包部署到JBOSS_Home\server\production\deploy下
我们用Ant实现,关于Ant参考http://kylinsoong.iteye.com/admin/blogs/787097这里直接给出build.xml
<?xml version="1.0"?> <project name="com.tibco.hibernate" default="deploy" basedir=".."> <property environment="env" /> <property name="app.dir" value="${basedir}\com.tibco.hibernate" /> <property name="src.dir" value="${app.dir}\src" /> <property name="jboss.home" value="${env.JBOSS_HOME}" /> <property name="jboss.server.config" value="production" /> <property name="build.dir" value="${app.dir}\build" /> <property name="build.classes.dir" value="${build.dir}\classes" /> <!-- Build classpath --> <path id="build.classpath"> <fileset dir="${jboss.home}\client"> <include name="*.jar" /> </fileset> <fileset dir="${jboss.home}\client\userService"> <include name="*.jar" /> </fileset> <pathelement location="${build.classes.dir}" /> </path> <target name="prepare" depends="clean"> <mkdir dir="${build.dir}" /> <mkdir dir="${build.classes.dir}" /> </target> <target name="compile" depends="prepare" description="compile"> <javac srcdir="${src.dir}" destdir="${build.classes.dir}" debug="on" deprecation="on" optimize="off" includes="com/**"> <classpath refid="build.classpath" /> </javac> </target> <target name="ejbjar" depends="compile" description="ejbjar"> <jar jarfile="${app.dir}\UserBean.jar"> <fileset dir="${build.classes.dir}"> <include name="com/tibco/hibernate/po/*.class" /> <include name="com/tibco/hibernate/po/bean/*.class" /> </fileset> <metainf dir="${src.dir}\META-INF"> <include name="persistence.xml" /> </metainf> </jar> </target> <target name="deploy" depends="ejbjar"> <copy file="${app.dir}\UserBean.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy" /> </target> <!-- =================================================================== --> <!-- Cleans up generated stuff --> <!-- =================================================================== --> <target name="clean"> <delete dir="${build.dir}" /> <delete file="${jboss.home}\server\${jboss.server.config}\deploy\UserBean.jar" /> </target> </project>
运行Ant,文件部署成功
5 测试
运行这段代码可以插入一条数据并查询:
public static void main(String[] args) throws NamingException { Properties properties = new Properties(); properties.setProperty(Context.INITIAL_CONTEXT_FACTORY , "org.jnp.interfaces.NamingContextFactory"); properties.setProperty(Context.PROVIDER_URL, "jnp://localhost"); Context ctx = new InitialContext(properties); UserService userService = (UserService) ctx.lookup("UserServiceBean/remote"); User user = JPAClient.getUser(); userService.insertUser(user); for(User u : userService.getUserList()) { System.out.println("id:" + u.getId() + " name:" + u.getName()); } }
当然我们也可以运用反射修改刚才插入的user:
public static void main(String[] args) throws NamingException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Properties properties = new Properties(); properties.setProperty(Context.INITIAL_CONTEXT_FACTORY , "org.jnp.interfaces.NamingContextFactory"); properties.setProperty(Context.PROVIDER_URL, "jnp://localhost"); Context ctx = new InitialContext(properties); Object obj = ctx.lookup("UserServiceBean/remote"); for(Method m : obj.getClass().getMethods()) { if(m.getName().compareTo("updateName") == 0){ m.invoke(obj, new Object[]{"Kobe Bryant", new Long(1)}); } } for(Method m : obj.getClass().getMethods()) { if(m.getName().compareTo("getUserByID") == 0) { User user = (User) m.invoke(obj, new Object[]{new Long(1)}); System.out.println(user.getName()); } } }
发表评论
-
Oracle - Add Exist Validation Before Create Table
2011-11-07 13:49 1464Usually we need to check the ta ... -
JMX Architecture & "Hello Word" the JMX way
2011-10-25 20:07 1819JMX Architecture Overview: JMX ... -
Jboss-eap-5.1 Messaging
2011-08-02 21:50 2481This section I will concertate ... -
Jboss-eap-5.1 starting up note
2011-07-26 22:46 2593Jboss enterprise platform 5 hav ... -
EJB Security & JAAS Demo
2011-05-21 19:39 1616PROLOGUE: When deploying ... -
JBoss LoginInitialContext Factory Implementation
2011-05-15 16:05 1537Jboss has a series of imp ... -
Jboss Reference Exception Gallery
2011-04-27 14:08 28991. Unable to locate a login con ... -
Hibernate Annotation 的一个问题,给点意见
2011-03-10 12:43 22问题:org.hibernate.annotations. ... -
大家说说BBC的网站用的是什么技术做的
2011-02-22 05:01 1443最近在英国出差,发现这里的一些网站做的相当有特色,有些网站不是 ... -
Hibernate OneToMany 单向和双向配置对数据存取性能的比较
2011-02-08 17:06 23341. 开篇说明:今天是春 ... -
对Hibernate属性(CascadeType、JoinColumn、JoinTable、ForeignKey等)的研究
2010-12-26 15:45 16689本文列出几个“EJB 学习阶段总结:JBoss下发布一个Toy ... -
EJB 学习阶段总结:JBoss下发布一个Toy企业应用
2010-12-25 12:11 2649解释题目:为什 ... -
EJB7: Message Driven Bean
2010-12-21 22:42 2153在企业系统中需要使用 ... -
JPA dev: 几个问题总结(续)
2010-11-25 18:02 24892. 如何由PoJo类生成数据库中的表 首先可以根据实体间关 ... -
JPA dev: 几个问题总结
2010-11-25 16:56 3409最近工作中遇到几个与JPA相关的问题,本文通过一个例子总结一下 ... -
JAXB学习
2010-11-24 22:35 01 什么是JAXB? JAXB全称Java Ar ... -
EJB5: JPA扩展-J2SE环境下使用EntityManager
2010-11-10 19:07 2712好久没有写博客了,最近比较忙,今天抽时间写点,最近 ... -
EJB4:RMI和RMI-IIOP
2010-11-02 21:14 4138计划提纲:引入→RMI概念→RMI HelloWorld程序→ ... -
EJB3: JBOSS 企业版、JBOSS服务器构架、EJB2.0 HelloWrold实例
2010-10-26 22:43 6479本文的研究基于jboss-eap- ... -
jboss-eap-4.3 启动停止在Configuring from URL: resource:jboss-log4j.xml 问题
2010-10-25 14:49 4055如题,我改用jboss-eap-4.3, 启动时停止在Conf ...
相关推荐
在本入门例子中,我们将深入理解EJB的基本概念,包括实体(Entity)、会话(Session)和消息驱动(Message-Driven)Bean,以及如何在实际项目中使用它们。 **1. EJB组件** - **实体Bean(Entity Bean)**:代表...
在这个 ejb 学习的例子中,我们将深入探讨实体Bean(Entity Bean)和会话Bean(Session Bean),以及它们如何与前端交互。 1. **实体Bean(Entity Bean)**: 实体Bean代表应用程序中的持久数据,通常映射到数据库...
EJB系统由三个主要组件构成:会话bean(Session Beans)、实体bean(Entity Beans)和消息驱动bean(Message-Driven Beans)。这些组件可以看作是服务提供者,为客户端应用程序提供服务。 1. **会话bean**: - **...
虽然EJB 3.0规范主要讨论Session Bean,但还包含了对实体Bean(Entity Bean)的支持,这些Bean与数据库中的记录对应。`@Entity`注解用于声明一个持久化的Java类,而`@Table`, `@Id`, `@GeneratedValue`等注解则用于...
- **实体Bean(Entity Bean)**:代表业务数据模型,通常与数据库中的表进行映射。EJB3引入了JPA(Java Persistence API),使得实体Bean的管理更加简单。 - **会话Bean(Session Bean)**:提供业务逻辑服务,...
在EJB3.0规范中,实体Bean(Entity Bean)是一种持久化对象,它们负责存储应用程序中的业务数据。本教程聚焦于实体Bean的继承机制,这允许开发人员创建具有层次结构的数据模型,使得子类可以扩展父类的属性和行为。...
- **实体Bean(Entity Beans)**:映射到数据库中的持久性对象,代表业务数据。 - **消息驱动Bean(Message-Driven Beans)**:用于处理JMS(Java Message Service)消息的后台组件。 2. **EJB开发步骤**: - ...
1. **注解驱动(Annotation-based)**:在EJB3中,开发者可以使用注解来声明组件的角色、生命周期方法和持久化属性,如`@Entity`、`@Stateless`、`@Stateful`、`@SessionBean`等,大大减少了XML配置文件的使用。...
6. **依赖注入(Dependency Injection)**:EJB3.0引入了CDI(Contexts and Dependency Injection)的概念,允许容器自动管理Bean的生命周期和依赖关系,减少了手动管理对象的复杂性。 7. **查询语言(Query ...
在本“EJB简单例子”中,我们将探讨EJB的基本概念、类型以及如何创建和运行一个简单的EJB应用。 1. **EJB组件类型** - **会话Bean(Session Beans)**:代表客户端的临时会话,提供业务逻辑服务。分为无状态会话...
本文档主要介绍了在Java EJB3环境中,如何实现三种不同类型的Bean:实体Bean(Entity Bean)、会话Bean(Session Bean)和消息驱动Bean(Message-Driven Bean)。 1. 开发环境: - **MyEclipse 7.0**:这是一个...
EJB主要分为三种类型:会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-Driven Beans)。其中,会话Bean代表临时的业务逻辑,实体Bean则封装持久化的数据,而消息驱动Bean则用于处理...
1. **实体Bean(Entity Bean)**:EJB 3.0引入了注解驱动的实体管理,允许开发者直接在Java类上使用`@Entity`注解来声明一个实体Bean。实体Bean代表数据库中的持久化对象,通过`@Table`指定对应的表名,`@Id`标记...
4. **嵌入式EJB(Embedded EJB)**:这是Java EE 6引入的一个新概念,它允许在Java SE应用程序中使用EJB,简化了小型企业级服务的开发。嵌入式EJB可以在非Java EE容器中运行,如Java SE应用或Swing应用,无需部署到...
- **EJB组件**: EJB主要包括三种类型的组件:会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-Driven Beans)。 - **会话Bean**:负责处理客户端请求,不持久化状态,通常代表一个...
在EJB规范中,实体Bean(Entity Bean)是一种特殊类型的组件,用于持久化数据到数据库,模拟业务对象。事务管理则是EJB中的重要组成部分,确保了业务操作的一致性和可靠性。 1. **EJB实体Bean** - **定义**: EJB...
EJB主要有三种类型:会话Bean(Session Beans)、实体Bean(Entity Beans)和消息驱动Bean(Message-Driven Beans)。在这个例子中,我们可能关注的是会话Bean,因为它们通常用于处理临时性的业务逻辑,包括与数据库...
3. **实体bean(Entity Beans)**:封装数据库中的持久化数据,对应于数据库表的行。在Java EE 5之后,JPA(Java Persistence API)替代了传统的实体bean,提供了更灵活的ORM(对象关系映射)机制。 在"ejb小例子...
在EJB中,实体Bean(Entity Bean)是持久化对象的代表,它们负责存储和检索数据库中的数据。在这个“EJB实体Bean学习”主题中,我们将深入探讨实体Bean的两大类型——BMP(Business Managed Persistence)和CMP...
EJB2.X 的使用例子,讲解了EJB2.X Entity Bean如何映射数据至表中, Session Bean如何使用,客户端调用Session Bean 中的业务方法. 有问题,请联系本人: QQ:343827585 (注:源码下载后,请删除后缀名为 .java的相应...