Java 在struts2和JBOSS 7.1中未初始化JPA EntityManager
我正在使用Jboss提供的JPA库启动基于struts2的应用程序。 我已经在standalone.xml中配置了数据源,我可以从jboss管理控制台看到 数据源已创建。并读取和处理presistence.xml文件。 但是如果我在Action类中检查EntityManager实例。它总是说空 下面是我的persistence.xml和操作类代码片段Java 在struts2和JBOSS 7.1中未初始化JPA EntityManager,java,jpa,struts2,jboss7.x,cdi,Java,Jpa,Struts2,Jboss7.x,Cdi,我正在使用Jboss提供的JPA库启动基于struts2的应用程序。 我已经在standalone.xml中配置了数据源,我可以从jboss管理控制台看到 数据源已创建。并读取和处理presistence.xml文件。 但是如果我在Action类中检查EntityManager实例。它总是说空 下面是我的persistence.xml和操作类代码片段 <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
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_2_0.xsd">
<persistence-unit name="primary">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/mysqlDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<!-- Properties for Hibernate -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>
</persistence>
org.hibernate.ejb.HibernatePersistence
java:jboss/datasources/mysqlDS
假的
Struts2动作类:
public class RegistrationAction extends ActionSupport implements SessionAware,Preparable ,ModelDriven{
/**
*
*/
private static final long serialVersionUID = 1L;
@PersistenceContext(unitName="primary")
private EntityManager em;
@Override
public Object getModel() {
// TODO Auto-generated method stub
return null;
}
@Override
public void prepare() throws Exception {
if(em==null)
System.out.println(" EM is null still..");
//even Persistence.createEntityManagerFactory("primary"); returning NULL
}
@Override
public void setSession(Map<String, Object> arg0) {
// TODO Auto-generated method stub
}
public EntityManager getEm() {
return em;
}
public void setEm(EntityManager em) {
this.em = em;
}
}
public class RegistrationAction扩展了ActionSupport实现了SessionAware、可准备、模型驱动{
/**
*
*/
私有静态最终长serialVersionUID=1L;
@PersistenceContext(unitName=“primary”)
私人实体管理者;
@凌驾
公共对象getModel(){
//TODO自动生成的方法存根
返回null;
}
@凌驾
public void prepare()引发异常{
if(em==null)
System.out.println(“EM仍然为null…”);
//甚至Persistence.createEntityManagerFactory(“主”);返回NULL
}
@凌驾
公共无效设置会话(映射arg0){
//TODO自动生成的方法存根
}
公共实体管理器getEm(){
返回em;
}
公共无效setEm(实体管理器em){
this.em=em;
}
}
操作由Struts容器管理
EntityManager由CDI容器管理。您可以将其注入CDI管理的对象(EJB容器中的EJB、CDI管理的bean、servlet、ecc…),但不能注入操作中
您需要使用或执行查找以获取它。您甚至不应该将其注入到操作中,顺便说一句,最好使用业务组件(例如EJB)并对其执行查找
如果不使用CDI插件(例如,因为使用了Spring插件),Rob Veldpaus的插件就非常适合这样做
EJB示例:
@Stateless
public class MyEjb{
@PersistenceContext(unitName="primary")
EntityManager em;
public Foo find(long id){
return em.find(Foo.class, id);
}
}
行动示例:
public class RegistrationAction extends ActionSupport
implements SessionAware,Preparable ,ModelDriven {
public String execute(){
MyEjb ejb = new CdiUtil().lookup(MyEjb.class);
System.out.println(ejb.find(1L));
return SUCCESS;
}
/* your other stuff here */
}
struts 2插件为我工作
其中包括pom.xml:
<!-- Import the CDI API -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-cdi-plugin</artifactId>
<version>${struts2.version}</version>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.0-SP1</version><!--$NO-MVN-MAN-VER$-->
<scope>provided</scope>
</dependency>
一些建议,因为我不知道确切的答案。您使用的是容器还是bean管理的持久性?如果是CMT,那么您是否尝试过注入entityManagerFactory而不是entityManager?我没有使用EJB。它是否适用于web组件?是的。作为一个初步建议,尝试注入entityManager工厂而不是entityManager。你可以在谷歌上搜索如何做到这一点。如果您得到不同的答案,请首先尝试他们的方法,因为我不太确定entityManagerFactory的增值。我尝试过注入EMF,但仍然存在相同的问题。这与struts2 famework有关。因为我编写了简单的servlet,并尝试注入EM,效果很好。如果我通过strut2 dispatcher或其他什么东西,它就不起作用了。太好了。但我还有另一个问题。我尝试使用em.persit()保存模型。。它说:JBAS011469:执行此操作需要事务(使用事务或扩展持久性上下文)。。如果我尝试调用em.getTransaction()表示EntityManager无法使用事务。。有什么建议吗?我已经有@PersistenceContext(unitName=“primary”,type=PersistenceContextType.TRANSACTION)了。您需要在EJB(默认情况下,事务由容器管理)或CDI组件(通过手动处理事务或使用@Interceptor)中执行此操作,或者如果您想在视图层(操作)中执行此操作,你需要使用。我强烈建议使用EJB3.1方式。我正在为一家公司编写一个工作门户。我正在考虑切换到Tomcat7-EclipseLink。我不认为我需要EJB和Jboss提供的其他服务。。你怎么说?抱歉,这是离题的。您可以按照BalusC的博客文章中的描述在Tomcat中安装,或者简单地使用,我从来没有听说过任何人在任何地方对它说三道四。如果你想让EclipseLink开箱,你需要
public class SampleAction extends BaseAction{
private static final long serialVersionUID = 1L;
@PersistenceUnit
private EntityManagerFactory emf;
@Action(value="add")
public String add(){
try{
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
........
em.merge(...);
em.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
}
return SUCCESS;
}
}