`
jamjar
  • 浏览: 14135 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

EJB3.0中的实体Bean在事件回调方法中得到EntityManager

阅读更多
图书管理系统的一个需求:需要对图书进行分类,分类之间有隶属关系,这样所有的分类就形成了一棵“分类树”。为了快速地找到某个分类下的所有子分类(包括孙子,曾孙分类),
每个分类需要保存一个序列号,这个序列号反应了本分类在分类树中的位置。举个例子,有如下四个分类“食物,水果,肉类,香蕉”,其中,香蕉属于水果,水果属于食物,肉类也属于食物。构成的分类树是这样的

食物--水果--香蕉
   |--肉类

可以这样分配序列号(每一代分类用两位数字表示,可以根据需要用更多或更少的位数):
食物(00)--水果(0000)--香蕉(000000)
         |--肉类(0001)

每个分类都继承父分类的序列号,在加上两位的按递增的序号。如果要找到食物的所有子分类,就可以用 类似“from 分类表 where 序列号 like 00%”的sql语句快速找到。
这种设计方法也可以适用于其他有树结构的领域模型,如组织机构。
用EJB3.0的实体Bean来实现这个模型基本上是很简单,详细的代码就不列出来。比较麻烦的是这个序列号字段不能使用数据库提供的序列号生成器来生成,必须得我们自己来生成。生成序列号的步骤:
1,得到父分类的序列号supercsn
2,根据supercsn到数据库中查找兄弟分类的最大序列号maxcsn
3,把maxcsn的最后两位的数字加一,作为本分类的序列号。

生成序列号的最好时机就是在实体bean的PrePersist事件中,也就需要在PrePersist事件中访问数据库。这时,你是不是很自然得想到用这样的代码得到EntityManager:
@Entity
public class Category implements Serializable {
@PersistenceContext
  EntityManager em;
..........
}
当时,很不幸的是:这样得不到EntityManager,每次都是Null.(如果哪位大哥能这样获得的,请告诉我一下)。经过查询Jboss的文档,发现了另外一个变通的办法。Jboss可以把EntityManagerFactory保存到jndi中去,因此就可以从jndi查找出EntityManagerFacotry来,再用它来创建出EntityManager来。
为了达到上述目的,需要修改EJB工程的Persistence.xml文件
	<persistence-unit name="BookStorePU" transaction-type="JTA">
		<jta-data-source>java:bookshopDS</jta-data-source>
		<properties>
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
<!--将entity manager factory 绑定到 java:/BookStorePUEMF-->
			<property name="jboss.entity.manager.factory.jndi.name"
				value="java:/BookStorePUEMF" />
		</properties>
	</persistence-unit>


在实体bean中就可以得到EntityManagerFactory了。
   @PrePersist
	public void setUpCSN() {
	   log.info("Persist "+getCname()+" begin");
		String supercsn = "";
		String mycsn="";
        Properties env=new Properties();
		if (this.getSuperCategory() != null) {
			supercsn = getSuperCategory().getCsn();
			log.info("super category "+getSuperCategory().getCname()+" CSN:"+supercsn);
		}
		if (supercsn==null){
			supercsn="";
		}
		EntityManager em=null;
		EntityManagerFactory emf=null;
		int csnlen = supercsn.length()+Consts.CATEGORY_CSN_LEVELLENTH;
		try {
			env.load(getClass().getResourceAsStream("/jndi.properties"));
			Context ctx= new InitialContext(env);
			Object o=ctx.lookup("java:/BookStoreEM");
			emf=(EntityManagerFactory)o;
			em=emf.createEntityManager();
			String eql="select max(c.csn) as m from Category c where length(c.csn)="+csnlen+" and c.csn like'"+supercsn+"%'";
			Query qry=em.createQuery(eql);
			List rstList=qry.getResultList();
			String maxcsn=(String) rstList.get(0);
			log.info(getCname()+" maxcsn:"+maxcsn);
			if (maxcsn==null){
				mycsn=supercsn+supplyZero(Consts.CATEGORY_CSN_LEVELLENTH);
			}else{
    			mycsn=genNextCSN(maxcsn,csnlen);
			}
			this.setCsn(mycsn);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			em.close();
			
		}
		//log.info("Persist "+getCname()+" begin."); 
	}


补充一下,需要在类路径下放一个jndi.properties的文件,以保证能够访问到应用服务器的jndi

分享到:
评论
2 楼 java.fan 2008-10-06  
以上纯属讨论。绝非攻击。

jfan
1 楼 java.fan 2008-10-06  
看不出有什么好处,
也看不出有什么亮点。

操作的流程都一样的,数据库连接等等操作都是一样的,又没有减少。
只是把操作的“时机”放在了不同的地方。
楼主不觉得多此一举吗?

相关推荐

    2022年EJB3.0之实体Bean的继承Java教程.docx

    2022年EJB3.0之实体Bean的继承Java教程.docx

    EJB3.0开发Session Bean.rar

    EJB3.0开发Session Bean.rar EJB3.0开发Session Bean.rar

    EJB 3.0学习之实体Bean

    在EJB3.0中开发实体Bean非常简单,你可以象开发一般的java bean一样编程,只需做少量的注释。一个实体bean不需要实现Home接口或者Remote、Local接口。

    EJB3.0中文文档

    EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.

    ejb3.0入门图文教程

    ejb3.0入门图文教程,包括EJB3.0开发Entity.pdf、EJB3.0开发Message Driven Bean.pdf、EJB3.0开发Session Bean.pdf

    EJB3.0开发Message Driven Bean

    EJB3.0开发Message Driven Bean

    EJB3.0开发Session Bean

    EJB3.0开发Session Bean

    ejb3.0实例教程

    不要求像过去那样实现特殊的回调界面或者扩展 EJB 类。所以它 将使 EJB 的开发更像常规的 Java 开发。 作者对 EJB3.0 接触的时间很短,所以一些新的概念和知识理解也难免有误,有些概念和语义把握的不是很准, 希望...

    EJB3.0入门经典(PDF)

    《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与章节内容相关的实例,给出了开发过程中运用到的技巧和注意事项,相信读者一定能从中获益。

    精通EJB3.0 中文版 3/3

    第二部分重点关注EJB编程的具体内容和过程,向开发者展示了如何使用会话Bean、将会话Bean发布为Web服务、消息驱动Bean;第三部分专注于高级EJB专题;第四部分是附录,收集了EJB组件技术相关的其他内容。

    EJB3.0 简介

    EJB3.0中实体Bean,会话Bean,以及部分新特性的简单介绍

    精通EJB3.0 中文版 1/3

    第二部分重点关注EJB编程的具体内容和过程,向开发者展示了如何使用会话Bean、将会话Bean发布为Web服务、消息驱动Bean;第三部分专注于高级EJB专题;第四部分是附录,收集了EJB组件技术相关的其他内容。

    EJB 3.0从入门到精通

    全书共分16章,内容依次包含了Java EE概述、EJB基础、搭建EJB环境、会话bean、持久化实体、持久化实体管理器、对象关系映射、JPQL查询、消息驱动bean、事务、提高EJB 3.0性能、从Web层访问EJB 3和EJB安全、EJB和Web...

    ejb3.0开发规范PDF

    ejb3.0开发规范,开发ejb3.0过程中的参考文档

    EJB3.0无状态SessionBean例子

    里面包含本地接口的SessionBean和远程接口的SessionBean。

    EJB3.0源代码,包含会话Bean,实体Bean,还有消息Bean

    EJB3.0的源代码,包含会话Bean,实体Bean,还有消息Bean

    EJB3.0实体的注解规范

    EJB3.0实体的注解规范,覆盖了EJB3.0(也就是JPA)实体的注解规范以及Hibernate特有的扩展

    JPA 批注参考 EJB3.0实体Bean注解详细解析

    在JPA 之前,Java EE 应用程序将持续类表示为容器管理的实体bean 。使用JPA,您可以将 任何普通的旧式Java 对象(POJO) 类指定为JPA 实体:一个应使用JPA 持续性提供程序的 服务将其非临时字段持久保存到关系数据库...

    weblogic+ejb3.0例子

    weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0weblogic+ejb3.0

    ejb3.0开发实例(java工程)

    ejb3.0开发实例,会话bean开发,完整代码,适合入门学者

Global site tag (gtag.js) - Google Analytics