javax.ejb.EJBException java.lang.IllegalStateException:无法检索unitName的EntityManagerFactory [英] javax.ejb.EJBException java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName

查看:103
本文介绍了javax.ejb.EJBException java.lang.IllegalStateException:无法检索unitName的EntityManagerFactory的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用EJB开发JavaEE应用程序.

I'm working on a JavaEE application with EJB.

我有一个名为 Medico 的实体,其代码为:

I have an Entity called Medico which code is:

@Entity
public class Medico implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

/**
 * 
 */

public Medico(String nome_medico, String morada_medico,
        String esp, GregorianCalendar dnasc_medico, int tel_medico) { //construtor parametrico
    super();
    this.nome_medico = nome_medico;
    this.morada_medico = morada_medico;
    this.esp = esp;
    this.dnasc_medico = dnasc_medico;
    this.tel_medico = tel_medico;
}


@Id
@GeneratedValue
private int cod_medico; //bi
private String nome_medico;
private String morada_medico;
private String esp;
@Temporal(TemporalType.DATE)
private GregorianCalendar dnasc_medico;
private int tel_medico;
private ArrayList<GregorianCalendar> agenda_consultas;
private ArrayList<GregorianCalendar> agenda_atos;
private int total_atos;
private int total_presc;



public int getTotal_presc() {
    return total_presc;
}

public void setTotal_presc(int total_presc) {
    this.total_presc = total_presc;
}

public Medico(){ //construtor vazio
    super();
}

public int getTotal_atos() {
    return total_atos;
}



public void setTotal_atos(int total_atos) {
    this.total_atos = total_atos;
}

public ArrayList<GregorianCalendar> getAgenda_consultas() {
    return agenda_consultas;
}

public void setAgenda_consultas(ArrayList<GregorianCalendar> agenda_consultas) {
    this.agenda_consultas = agenda_consultas;
}

public ArrayList<GregorianCalendar> getAgenda_atos() {
    return agenda_atos;
}

public void setAgenda_atos(ArrayList<GregorianCalendar> agenda_atos) {
    this.agenda_atos = agenda_atos;
}

public int getCod_medico() {
    return cod_medico;
}

public void setCod_medico(int cod_medico) {
    this.cod_medico = cod_medico;
}

public String getNome_medico() {
    return nome_medico;
}

public void setNome_medico(String nome_medico) {
    this.nome_medico = nome_medico;
}

public String getMorada_medico() {
    return morada_medico;
}

public void setMorada_medico(String morada_medico) {
    this.morada_medico = morada_medico;
}

public String getEsp() {
    return esp;
}

public void setEsp(String esp) {
    this.esp = esp;
}

public GregorianCalendar getDnasc_medico() {
    return dnasc_medico;
}

public void setDnasc_medico(GregorianCalendar dnasc_medico) {
    this.dnasc_medico = dnasc_medico;
}

public int getTel_medico() {
    return tel_medico;
}

public void setTel_medico(int tel_medico) {
    this.tel_medico = tel_medico;
}

@Override
public String toString() {
    return "Medico [cod_medico=" + cod_medico + ", nome_medico="
            + nome_medico + ", morada_medico=" + morada_medico + ", esp="
            + esp + ", dnasc_medico=" + dnasc_medico + ", tel_medico="
            + tel_medico + "]";
}
}

然后我创建了一个会话bean实现类:

Then I created a session bean implementation class:

@Stateless
public class HospitalManagement implements AdministradorSessionRemote,GestorSessionRemote {

/**
 * Default constructor. 
 */
@PersistenceContext(unitName="Hospital")
private EntityManager em;
public HospitalManagement() {
    // TODO Auto-generated constructor stub
}


@Override
public String cria_medico(String nome_medico, String morada_medico,
        String esp, GregorianCalendar dnasc_medico, int tel_medico) {
        Medico md = new Medico (nome_medico, morada_medico, esp, dnasc_medico,tel_medico);
    em.persist(md);
    return "Medico "+Integer.toString(md.getCod_medico())+" criado!"; 
}

该类实现两个接口,但是上面的方法仅在以下一个中使用:

This class implements two interfaces, but the method above is only used in the following one:

@Remote
public interface GestorSessionRemote {


public String cria_medico(String nome_medico,String morada_medico,String esp,GregorianCalendar dnasc_medico, int tel_medico);
public String procura_nome_medico(String nome);
public String procura_cod_medico(int cod);
public String altera_morada_med(int cod, String morada);
public String altera_telemovel_med(int cod, int tel);

然后我创建了一个客户端:

Then I created a client:

public class GestorClient {

public static void main(String[] args){

        InitialContext ctx =new InitialContext();
        GestorSessionRemote g=(GestorSessionRemote)ctx.lookup("java:global/HospitalEAR/Hospital/HospitalManagement!Sessions.GestorSessionRemote");
        System.out.println(g.cria_medico(nomem, moradam, esp,cal,telm));

其中方法的参数是通过scannig从键盘获得的.

where the parameters of the method are obtained by scannig from the keyboard.

我还创建了以下persistence.xml文件:

I've also created the following persistence.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence    http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="Hospital">
    <properties>
    <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
    </properties>
    </persistence-unit>
    </persistence>

当我尝试部署应用程序时,发生错误.这是完整的堆栈跟踪:

When I try to deploy the application, an error occurs. Here is the complete stacktrace:

Exception in thread "main" javax.ejb.EJBException
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:212)
at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79)
at com.sun.proxy.$Proxy236.cria_medico(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:143)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:173)
at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528)
at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930)
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222)
at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: java.lang.IllegalStateException: Unable to retrieve EntityManagerFactory for unitName Hospital
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper.java:138)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTxRequiredCheck(EntityManagerWrapper.java:158)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.doTransactionScopedTxCheck(EntityManagerWrapper.java:151)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:281)
at Sessions.HospitalManagement.cria_medico(HospitalManagement.java:45)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:55)
at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:205)
... 19 more

有人可以帮助我了解这种情况发生的原因吗?

Could someone help me understand the reason why this is happening?

推荐答案

显而易见的问题是,您没有在persistence.xml中指定jta-data-sourcetransaction-type.

The obvious problem is that you didn't specify a jta-data-source and the transaction-type in your persistence.xml.

像这样指定jta-data-source:

  <persistence-unit name="Hospital">
    <jta-data-source>jdbc/sample</jta-data-source>
  </persistence-unit>

您必须在Glassfish实例中创建JDBC资源.为此,请在http://localhost:4848下打开Glassfish Admin GUI,然后在Resources-> JDBC Connection Pools下创建一个连接池.然后在Resources-> JDBC Resources下创建一个名为jdbc/sample JDBC资源,并使其引用新的连接池.

You have to create the JDBC resource in your Glassfish instance. To do this open the Glassfish Admin GUI under http://localhost:4848 and create a Connection Pool under Resources -> JDBC Connection Pools. Then create a JDBC resource under Resources -> JDBC Resources named jdbc/sample and make it reference the new connection pool.

此外,服务器似乎以某种方式认为您要使用transaction-type RESOURCE_LOCAL,这要求您指定EntityManagerFactory以获得EntityManager的实例.

Further, it looks like the server somehow thinks that you want to use transaction-type RESOURCE_LOCAL which requires that you specify an EntityManagerFactory to get an instance of the EntityManager.

JTA应该是默认的transaction-type,但是您可能必须像这样在persistence.xml中明确指定transaction-type:

JTA should be the default transaction-type in a Java EE environment but you may have to explicitly specifiy the transaction-type in the persistence.xml like this:

<persistence-unit name="Hospital" transaction-type="JTA">

另请参见:

这篇关于javax.ejb.EJBException java.lang.IllegalStateException:无法检索unitName的EntityManagerFactory的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆