web-dev-qa-db-ja.com

EntityManagerがnullである理由

私のWebアプリケーションでは、Apache Tomcat(TomEE)/7.0.37サーバーでOpenJPAを使用しています。 Netbeansを使用してクラスを自動生成します(「データベースからのエンティティクラス...」および「エンティティクラスからのセッションBean ...」)。 SessionBean(たとえば、UserFacade)で、EntityManagerを取得したい:

@Stateless
public class UserFacade extends AbstractFacade<User> {
  @PersistenceContext(unitName = "CollDocPU")
  private EntityManager em;

  @Override
  protected EntityManager getEntityManager() {
    return em;
  }
}

しかし、上記の方法で取得すると、nullになります。私がそれを作るとき:

@Override
protected EntityManager getEntityManager() {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("CollDocPU");
    EntityManager ecm = emf.createEntityManager(); 
    return ecm;
}    

ecmはnullではなく、問題ありません

私のpersistence.xml:

<?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="CollDocPU" transaction-type="RESOURCE_LOCAL">
<provider>org.Apache.openjpa.persistence.PersistenceProviderImpl</provider>
<class>model.entity.StudentAddSolution</class>
<class>model.entity.Lecturer</class>
<class>model.entity.Solution</class>
<class>model.entity.Student</class>
<class>model.entity.Course</class>
<class>model.entity.File</class>
<class>model.entity.CourseHasLecturer</class> 
<class>model.entity.Mail</class>
<class>model.entity.StudentAtCourse</class>
<class>model.entity.Roles</class>
<class>model.entity.Task</class>
<class>model.entity.User</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
   <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:11080/myBase?zeroDateTimeBehavior=convertToNull"/>
   <property name="javax.persistence.jdbc.password" value="pass,"/>
   <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
   <property name="javax.persistence.jdbc.user" value="myBase"/>
   <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
  </properties>
 </persistence-unit>
</persistence>
7
kuba44

NullでないEntityManagerをから取得するには

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

永続性.xmlを変更し、トランザクションタイプを「JTA」に変更して、以下を追加する必要があります。

<jta-data-source>Java:openejb/Resource/myDatabase</jta-data-source>
<non-jta-data-source>Java:openejb/Resource/myDatabaseUnmanaged</non-jta-data-source>

その後、サーバー構成でリソースを宣言する必要があります:[tomeeインストールフォルダー] /conf/tomee.xmlファイル:

<?xml version="1.0" encoding="UTF-8"?>
 <tomee>
  <Resource id="myDatabase" type="DataSource">
     JdbcDriver com.mysql.jdbc.Driver
     JdbcUrl jdbc:mysql://localhost:11080/jkitaj?zeroDateTimeBehavior=convertToNull
     UserName jkitaj
     Password pass,
  </Resource>

  <Resource id="myDatabaseUnmanaged" type="DataSource">
     JdbcDriver com.mysql.jdbc.Driver
     JdbcUrl jdbc:mysql://localhost:11080/jkitaj?zeroDateTimeBehavior=convertToNull
     UserName jkitaj
     Password pass,
     JtaManaged false
  </Resource>
 </tomee>

あっち見て:

http://openejb.979440.n4.nabble.com/org-Apache-openjpa-lib-jdbc-ReportingSQLException-type-not-found-or-user-lacks-privilege-td4665124.html

http://mobiarch.wordpress.com/2012/12/07/configuring-a-mysql-data-source-in-tomee/

3
kuba44

私のプロジェクトでは、JPA/HibernateとSpringでJerseyRestを使用していて、使用中は常にエンティティマネージャーをnullとして取得しているため、同じ問題に直面していました。

@PersistenceContext(name = "JPA_DEMO", type = PersistenceContextType.TRANSACTION)
 EntityManager em;

以下の構文のように手動で作成した場合は、正常に機能しています。

EntityManagerFactory ENTITY_MANAGER_FACTORY = Persistence.createEntityManagerFactory("JPA_DEMO");//
EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();

いくつかの調査の結果、問題は、エンティティマネージャーオブジェクトの挿入を担当する@PersistenceContextを使用しているにもかかわらず、オブジェクトを取得するクラス、つまり、によって使用されるクラスがないことです。 Springを使用して、エンティティマネージャオブジェクトを作成および取得し、@ PersistenceContextで定義されたEntityManagerオブジェクトに挿入します。責任のあるクラスはLocalContainerEntityManagerFactoryBeanで、これは私のapplication.xmlで定義されています(私のSpring Beanのロードに使用されます)。だから私はそれを定義し、それはうまくいきました。以下はそれを定義するための構文であり、トランザクションマネージャー用であるため、uはトランザクションも使用できます。

<tx:annotation-driven transaction-manager="transactionMgr" />

<bean id="transactionMgr" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="MgrFactory"/>
</bean>

    <bean id="MgrFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="packagesToScan" value="com.restDemo"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
            <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
1
Prakhar Agrawal

persistence.xmlファイルはMETA-INFフォルダーの下にある必要があります。構造を理解するには、 this ドキュメントを確認してください。

0
Gaurav