论坛首页 Java企业应用论坛

不同环境下JPA EntityManagerFactory的获得方式

浏览 14833 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-06-13  
这几天做一个小Web项目,因为之前在EJB中使用JPA比较习惯了所以想单独抽出JPA这块来做ORM
用JPA API来封装Hibernate core, hibernate-annonations,hibernate-entitymanager

方法很简单就是在WEB-INF\class下建立一个Persistence.xml文件,事务类型指定为JTA模式,并且通过JTA-DS在容器上制定数据源.然后问题来了

我在项目中建立一个class文件, 按理说这个文件非JavaEE范畴,那么应该通过手动获取EntityManagerFactory如下:
emf=Persistence.createEntityManagerFactory("puName");

那如果我想在ManagedBean中获得一个emf呢,可以直接注入么?还是直接得到一个EntityManager?
这让我想到如果是在EJB模块中建立一个class,能够通过注入来获得EntityManager么?他是受容器管理的类么?
   发表时间:2008-06-14  
通过实验发现在JSF的Managed Bean中并不能使用EJB injection,但是难道Managed Bean不是容器托管的么JavaEE资源之一么?

我分别使用了
@PersistenceUnit(unitName="puName")
EntityManagerFactory emf;

@PersistenceContext(unitName="puName")
EntityManager em;

的方法,结果都返回null说明注入失败
Google说大约是因为JBoss不完全支持JEE5的原因,于是更换成GlassFish v2尝试一下
以下同样的代码结果在GF中可以得到但是jboss中不行
JBoss版本4.2.2 GA
0 请登录后投票
   发表时间:2008-06-14  
JSF的Managed Bean只能通过
@EJB
来注入EJB的对象,持久化单元是不能注入的,但是你可以通过注入EJB来操作持久化单元啊
0 请登录后投票
   发表时间:2008-06-14  
难得冰封终于肯定下心来看JavaEE
0 请登录后投票
   发表时间:2008-06-16  
在jboss里,通过@PersistenceContext的方式是可以注入EntityManager的
@PersistenceContext(unitName="puName")
EntityManager em;

1.你需要检查persistence.xml文件里persistence-unit的name是否是“puName”
2.你需要检查:假如persistence.xml文件里jta-data-source的值为java:/test.那么你是否在jboss里配置了名为test的jndi。如果没有配置可到jboss安装目录下的\docs\examples\jca中找到你需要的数据库的模板。稍做修改即可,然后重启jboss。
希望能帮到你。

另:这篇写的还行,可看看。
http://hi.baidu.com/java_script/blog/item/5eb5e0dc0ceaada2cc116612.html
0 请登录后投票
   发表时间:2008-06-16  
lbfhappy 写道
JSF的Managed Bean只能通过
@EJB
来注入EJB的对象,持久化单元是不能注入的,但是你可以通过注入EJB来操作持久化单元啊


JSF中的Managed Bean的角色简单来说应该就是一个servlet吧?
这样的话我恰好google到一个最佳实践
http://weblogs.java.net/blog/ss141213/archive/2005/12/dont_use_persis_1.html

可以在servlet中利用
@PersistenceContext(name="refName" unitName="puName")
或者
@PersistenceUnit(unitName="puName")
来得到EM或者EMF的引用.区别在于,前者是容器管理EntityManager,这样就不需要声明方式管理事务也不需要自己手动close相关资源.后者是应用程序管理em,这样的话需要多一些try catch finally来完成事务管理和资源释放

引用
The EntityManagerFactory is a thread safe, very time consuming object to instantiate. Therefore it will be handy to have one available immediately after the start of the application. EntityManager on the otherhand, is a very light weight, un-threadsafe object. Therefore I have opted to use the EntityManager per HTTP request pattern.
0 请登录后投票
   发表时间:2008-06-16  
zhouyaguo 写道
在jboss里,通过@PersistenceContext的方式是可以注入EntityManager的
@PersistenceContext(unitName="puName")
EntityManager em;

1.你需要检查persistence.xml文件里persistence-unit的name是否是“puName”
2.你需要检查:假如persistence.xml文件里jta-data-source的值为java:/test.那么你是否在jboss里配置了名为test的jndi。如果没有配置可到jboss安装目录下的\docs\examples\jca中找到你需要的数据库的模板。稍做修改即可,然后重启jboss。
希望能帮到你。

另:这篇写的还行,可看看。
http://hi.baidu.com/java_script/blog/item/5eb5e0dc0ceaada2cc116612.html


你说这个是web app中的情况么?建议你先做做试验
如果是在EJB模块中,注入是没有任何问题但是在web app中用jboss就不能直接用@PersistenceContext或者@PersistenceUnit来注入了,报错如下:
严重: null
javax.naming.NameNotFoundException: persistence not bound
0 请登录后投票
   发表时间:2008-06-18  
仍然未解决中

今天下了JBoss 5 beta4 结果仍然让人失望 在glassfish中跑得好好的在jboss中怎么都不行
0 请登录后投票
   发表时间:2008-06-19  

jboss web app中是不能得到@PersistenceContext的
实际是应该
web app与EJB3分开部署,在web app中通过jndi lookup EJB3的service接口

结构是
webapp Container         remote call            Jboss EJB3 Container
_______________        __________         _______________

 

0 请登录后投票
   发表时间:2008-06-19  
badqiu 写道

jboss web app中是不能得到@PersistenceContext的
实际是应该
web app与EJB3分开部署,在web app中通过jndi lookup EJB3的service接口

结构是
webapp Container         remote call            Jboss EJB3 Container
_______________        __________         _______________

 

 

我这里主要是针对非EJB环境下也就是web app应用中获取EntityManager的探讨

谁说不能通过@PersistenceContext得到em的? 在GlassFish下通过

 

@PersistenceContext(name="refName" unitName="puName")
public class oneBean(){}

 的方法利用JNDI获取em的实例

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics