在EJB项目中遇到问题

时间:2016-05-17 20:32:28

标签: hibernate jpa java-ee ejb wildfly

我真的需要一些帮助:我正在使用JPA 2.2和带有MySQL数据库的WildFly应用服务器制作我的第一个EJB项目(3.2)。我试图使用我的EJB bean来保存数据,但却得到了一个非常庞大的数据,而且对我来说没有任何意义。执行该方法时出错(从托管bean调用)。我真的不知道可能导致它的原因(我认为它可能与JTA有关,但我不确定 - 所有这些东西真的是新手)。

我也不确定这个设计是不是一个好主意:我在这个例子中没有使用DAO对象,而且我不确定应该如何使用它。

你们有什么想法我应该从哪里开始寻找问题?

这是我的Managed 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类(我删除了接口的实现,因为我在某处读过EJB 3.2中没有必要......是吗?)

@Stateless
public class BaseEJBBean {

    @PersistenceContext
    protected EntityManager em;

    public void add(TestORM orm) {
        this.em.persist(orm);
    }
}

这是我的DAO课程。我注意到,当我调试代码时,它似乎并没有通过EJB类(我在那里放了一个断点,它直接转到DAO类中的另一个断点,甚至没有在任何地方调用它。 .. 这是为什么?)。我在构造函数的第二行得到一个空指针:

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);
    }

}

以下是我的例外的根本原因:

  

引起:java.lang.NullPointerException at   org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:76)     在   org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:118)     在   org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149)     在   org.hibernate.jpa.spi.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1602)     在   org.hibernate.jpa.spi.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:210)     在   org.hibernate.jpa.internal.EntityManagerImpl。(EntityManagerImpl.java:91)     在   org.hibernate.jpa.internal.EntityManagerFactoryImpl.internalCreateEntityManager(EntityManagerFactoryImpl.java:345)     在   org.hibernate.jpa.internal.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:313)     在br.com.meisa.caixaeestoque.comum.BaseDAO。(BaseDAO.java:15)     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native   方法)at   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     at java.lang.reflect.Constructor.newInstance(Constructor.java:408)     在   org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:113)     在   org.jboss.weld.injection.ConstructorInjectionPoint.invokeAroundConstructCallbacks(ConstructorInjectionPoint.java:87)     在   org.jboss.weld.injection.ConstructorInjectionPoint.newInstance(ConstructorInjectionPoint.java:74)     在   org.jboss.weld.injection.producer.AbstractInstantiator.newInstance(AbstractInstantiator.java:28)     在   org.jboss.weld.injection.producer.BasicInjectionTarget.produce(BasicInjectionTarget.java:116)     在   org.jboss.weld.injection.producer.BeanInjectionTarget.produce(BeanInjectionTarget.java:194)     在org.jboss.weld.bean.ManagedBean.create(ManagedBean.java:149)at   org.jboss.weld.context.unbound.DependentContextImpl.get(DependentContextImpl.java:69)     在   org.jboss.weld.manager.BeanManagerImpl.getReference(BeanManagerImpl.java:742)     在   org.jboss.weld.manager.BeanManagerImpl.getInjectableReference(BeanManagerImpl.java:840)     在   org.jboss.weld.injection.FieldInjectionPoint.inject(FieldInjectionPoint.java:92)     在org.jboss.weld.util.Beans.injectBoundFields(Beans.java:370)at   org.jboss.weld.util.Beans.injectFieldsAndInitializers(Beans.java:381)     在   org.jboss.weld.injection.producer.DefaultInjector $ 1.proceed(DefaultInjector.java:71)     在   org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:48)     在   org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:73)     在   org.jboss.weld.injection.producer.StatelessSessionBeanInjector.inject(StatelessSessionBeanInjector.java:58)     在   org.jboss.weld.injection.producer.ejb.SessionBeanInjectionTarget.inject(SessionBeanInjectionTarget.java:140)     在   org.jboss.as.weld.injection.WeldInjectionContext.inject(WeldInjectionContext.java:39)     在   org.jboss.as.weld.injection.WeldInjectionInterceptor.processInvocation(WeldInjectionInterceptor.java:51)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory $ ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:109)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.as.ee.component.ManagedReferenceFieldInjectionInterceptorFactory $ ManagedReferenceFieldInjectionInterceptor.processInvocation(ManagedReferenceFieldInjectionInterceptorFactory.java:109)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.as.ee.component.AroundConstructInterceptorFactory $ 1.processInvocation(AroundConstructInterceptorFactory.java:28)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.as.weld.injection.WeldInterceptorInjectionInterceptor.processInvocation(WeldInterceptorInjectionInterceptor.java:56)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.as.weld.ejb.Jsr299BindingsCreateInterceptor.processInvocation(Jsr299BindingsCreateInterceptor.java:94)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)     在   org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)     在   org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:273)     ... 101更多

1 个答案:

答案 0 :(得分:0)

我花了一点时间才意识到,因为我使用JTA,所以我不允许实例化一个新的实体管理器(是的,我知道:这里有新手)。

所以我删除了BaseDAO类中的整个构造函数,只需用@PersistenceContext注释它:

private final static String PERSISTENCE_UNIT_NAME = "caixaeestoque";

@PersistenceContext(unitName= PERSISTENCE_UNIT_NAME)
private EntityManager em;

希望它能帮助那些刚开始使用EJB和完整应用程序的人,就像我发布这个问题时一样!