在 EJB 项目中持久存在问题
Trouble persisting in an EJB project
我在这里真的需要一些帮助:我正在使用 JPA 2.2 并在具有 MySQL 数据库的 WildFly 应用程序服务器中制作我的第一个 EJB 项目 (3.2)。我正在尝试使用我的 EJB bean 来持久化数据,但是在执行该方法(从托管 bean 调用)时出现了一个非常大的 "says-nothing-to-me" 错误。我真的不知道是什么导致了它(我认为它可能与 JTA 有关,但我不确定 - 在所有这些方面真的是新手)。
我也不确定这个设计是否是个好主意:我在这个例子中没有使用 DAO 对象,我不确定我应该如何使用它。
你们知道我应该从哪里开始寻找问题吗?
这是我的托管 Bean。这里没什么特别的:
@ManagedBean
@ViewScoped
public class TesteMB {
@Inject private TesteORM testeORM;
@EJB private BaseEJBLocal baseService;
public void gravar() {
this.baseService.adiciona(this.testeORM);
}
public TesteORM getTesteORM() {
return testeORM;
}
public void setTesteORM(TesteORM testeORM) {
this.testeORM = testeORM;
}
}
这是我的 EJB bean class(我删除了接口的实现,因为我在某处读到它在 EJB 3.2 中没有必要...是这样吗?)
@Stateless
public class BaseEJBBean {
@PersistenceContext
protected EntityManager em;
public void add(TestORM orm) {
this.em.persist(orm);
}
}
这是我的 DAO class。我注意到,当我调试代码时,它似乎没有通过 EJB class(我在那里放置了一个断点,它直接进入 DAO class 中的另一个断点,甚至没有调用它任何地方……这是为什么?)。我在构造函数的第二行得到一个空指针:
public class BaseDAO<T extends Entidade> {
private final EntityManagerFactory factory;
private final EntityManager em;
private Class<T> clazz;
public BaseDAO() {
this.factory = Persistence.createEntityManagerFactory("caixaeestoque");
this.em = factory.createEntityManager();
}
public void insert(T orm) {
em.persist(orm);
}
}
这是我的异常的根本原因:
Caused by: java.lang.NullPointerException at
org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:76)
at
org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:118)
at
org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149)
at
org.hibernate.jpa.spi.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1602)
at
org.hibernate.jpa.spi.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:210)
at
org.hibernate.jpa.internal.EntityManagerImpl.(EntityManagerImpl.java:91)
at
org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:345)
at
org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:313)
at br.com.meisa.caixaeestoque.comum.BaseDAO.(BaseDAO.java:15)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method) at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
at
org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:113)
at
org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:87)
at
org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:74)
at
org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)
at
org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:116)
at
org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:194)
at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:149) at
org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)
at
org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:742)
at
org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:840)
at
org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)
at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:370) at
org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:381)
at
org.jboss.weld.injection.producer.DefaultInjector.proceed(DefaultInjector.java:71)
at
org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)
at
org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:73)
at
org.jboss.weld.injection.producer.StatelessSessionBeanInjector.inject(StatelessSessionBeanInjector.java:58)
at
org.jboss.weld.injection.producer.ejb.SessionBeanInjectionTarget.inject(SessionBeanInjectionTarget.java:140)
at
org.jboss.as.weld.injection.WeldInjectionContext.inject(WeldInjectionContext.java:39)
at
org.jboss.as.weld.injection.WeldInjectionInterceptor.processInvocation(WeldInjectionInterceptor.java:51)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:109)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:109)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.as.ee.component.AroundConstructInterceptorFactory.processInvocation(AroundConstructInterceptorFactory.java:28)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.as.weld.ejb.Jsr299BindingsCreateInterceptor.processInvocation(Jsr299BindingsCreateInterceptor.java:94)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
at
org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
at
org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:273)
... 101 more
我花了一点时间才意识到,由于我使用的是 JTA,因此不允许实例化新的实体管理器(是的,我知道:这里是新手)。
所以我删除了 BaseDAO 中的整个构造函数 class 并简单地用 @PersistenceContext:
注释了它
private final static String PERSISTENCE_UNIT_NAME = "caixaeestoque";
@PersistenceContext(unitName= PERSISTENCE_UNIT_NAME)
private EntityManager em;
希望它能帮助像我发布此问题时一样开始使用 EJB 和完整应用程序的其他人!
我在这里真的需要一些帮助:我正在使用 JPA 2.2 并在具有 MySQL 数据库的 WildFly 应用程序服务器中制作我的第一个 EJB 项目 (3.2)。我正在尝试使用我的 EJB bean 来持久化数据,但是在执行该方法(从托管 bean 调用)时出现了一个非常大的 "says-nothing-to-me" 错误。我真的不知道是什么导致了它(我认为它可能与 JTA 有关,但我不确定 - 在所有这些方面真的是新手)。
我也不确定这个设计是否是个好主意:我在这个例子中没有使用 DAO 对象,我不确定我应该如何使用它。
你们知道我应该从哪里开始寻找问题吗?
这是我的托管 Bean。这里没什么特别的:
@ManagedBean
@ViewScoped
public class TesteMB {
@Inject private TesteORM testeORM;
@EJB private BaseEJBLocal baseService;
public void gravar() {
this.baseService.adiciona(this.testeORM);
}
public TesteORM getTesteORM() {
return testeORM;
}
public void setTesteORM(TesteORM testeORM) {
this.testeORM = testeORM;
}
}
这是我的 EJB bean class(我删除了接口的实现,因为我在某处读到它在 EJB 3.2 中没有必要...是这样吗?)
@Stateless
public class BaseEJBBean {
@PersistenceContext
protected EntityManager em;
public void add(TestORM orm) {
this.em.persist(orm);
}
}
这是我的 DAO class。我注意到,当我调试代码时,它似乎没有通过 EJB class(我在那里放置了一个断点,它直接进入 DAO class 中的另一个断点,甚至没有调用它任何地方……这是为什么?)。我在构造函数的第二行得到一个空指针:
public class BaseDAO<T extends Entidade> {
private final EntityManagerFactory factory;
private final EntityManager em;
private Class<T> clazz;
public BaseDAO() {
this.factory = Persistence.createEntityManagerFactory("caixaeestoque");
this.em = factory.createEntityManager();
}
public void insert(T orm) {
em.persist(orm);
}
}
这是我的异常的根本原因:
Caused by: java.lang.NullPointerException at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:76) at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:118) at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1602) at org.hibernate.jpa.spi.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:210) at org.hibernate.jpa.internal.EntityManagerImpl.(EntityManagerImpl.java:91) at org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:345) at org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:313) at br.com.meisa.caixaeestoque.comum.BaseDAO.(BaseDAO.java:15) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:113) at org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:87) at org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:74) at org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28) at org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:116) at org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:194) at org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:149) at org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69) at org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:742) at org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:840) at org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92) at org.jboss.weld.util.Beans.injectBoundFields(Beans.java:370) at org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:381) at org.jboss.weld.injection.producer.DefaultInjector.proceed(DefaultInjector.java:71) at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48) at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:73) at org.jboss.weld.injection.producer.StatelessSessionBeanInjector.inject(StatelessSessionBeanInjector.java:58) at org.jboss.weld.injection.producer.ejb.SessionBeanInjectionTarget.inject(SessionBeanInjectionTarget.java:140) at org.jboss.as.weld.injection.WeldInjectionContext.inject(WeldInjectionContext.java:39) at org.jboss.as.weld.injection.WeldInjectionInterceptor.processInvocation(WeldInjectionInterceptor.java:51) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:109) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory$ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:109) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ee.component.AroundConstructInterceptorFactory.processInvocation(AroundConstructInterceptorFactory.java:28) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.weld.ejb.Jsr299BindingsCreateInterceptor.processInvocation(Jsr299BindingsCreateInterceptor.java:94) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309) at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:273) ... 101 more
我花了一点时间才意识到,由于我使用的是 JTA,因此不允许实例化新的实体管理器(是的,我知道:这里是新手)。
所以我删除了 BaseDAO 中的整个构造函数 class 并简单地用 @PersistenceContext:
注释了它private final static String PERSISTENCE_UNIT_NAME = "caixaeestoque";
@PersistenceContext(unitName= PERSISTENCE_UNIT_NAME)
private EntityManager em;
希望它能帮助像我发布此问题时一样开始使用 EJB 和完整应用程序的其他人!