2012-02-24 65 views
0

* 当我部署在GlassFish中的EntityManager项目null.if我用另一种东西,而不是RPC像servlet的项目工作可能 *的EntityManager是空

会话bean:

@Stateless 

public class logic implements logicLocal { 

    @PersistenceContext(unitName="T2PU") 
    private EntityManager em; 

    @Override 
    public void addToDB(Test t){ 

     em.persist(t); 
    } 

} 

和GWT RPC是:

public class MainRPCImpl extends RemoteServiceServlet implements MainRPC { 

    @EJB 
    logicLocal logic; 


    @Override 
    public String addToDB(Test t) { 
     String m="fail"; 
     try { 
      logic.addToDB(t); 
      m="done successfuly"; 
     } catch (Exception e) { 
      return m; 
     } 
     return m; 
    } 
} 

持久性单元是:

<persistence-unit name="T2PU" transaction-type="JTA"> 
    <jta-data-source>acm</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties/> 
    </persistence-unit> 
</persistence> 

和GlassFish资源

<resources> 
    <jdbc-connection-pool allow-non-component-callers="false" associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" connection-validation-method="auto-commit" datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" is-isolation-level-guaranteed="true" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="false" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="mysql_acm_rootPool" non-transactional-connections="false" pool-resize-quantity="2" res-type="javax.sql.DataSource" statement-timeout-in-seconds="-1" steady-pool-size="8" validate-atmost-once-period-in-seconds="0" wrap-jdbc-objects="false"> 
     <property name="serverName" value="localhost"/> 
     <property name="portNumber" value="3306"/> 
     <property name="databaseName" value="acm"/> 
     <property name="User" value="root"/> 
     <property name="Password" value="1234"/> 
     <property name="URL" value="jdbc:mysql://localhost:3306/acm"/> 
     <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
    </jdbc-connection-pool> 
    <jdbc-resource enabled="true" jndi-name="acm" object-type="user" pool-name="mysql_acm_rootPool"/> 
</resources> 

事先特意感谢。

回答

0

也许有不同的原因,但是您不需要在persistence.xml中为您的JNDI名称使用jdbc上下文前缀吗?事情是这样的:

<jta-data-source>jdbc/acm</jta-data-source> 

Glassfish administration guide

JDBC资源是通过指定 该资源将被关联的连接池创建的。使用独特的Java命名和目录接口(JNDI)名称来标识资源。 ...因为 所有JNDI名称都位于java:comp/env子上下文中,因此在管理控制台中指定 JDBC资源的JNDI名称时,请仅使用jdbc/name格式的 。

+0

感谢您的回复。当我使用DTO而不是直接使用实体项目工作时,你有任何想法直接使用实体吗? – hesam 2012-02-24 22:24:55