7

私は純粋なJPA2でJSF2を使用しています。しかし、問題はentityManagerにあります。

@PersistenceContext
private EntityManager entityManager;

ここでは、entityManagerは注入されず、常にnullになります。誰かが私のコードの何が悪いのか教えてくれませんか。

これが私の設定です。

User.java

    @Entity
    @Table(name="USER")
    public class User {

        private int id;
        private String name;
        private String surname;

        @Id
        @SequenceGenerator(name="user_id_seq_gen", sequenceName="USER_ID_GEN_SEQ", allocationSize=1)
        @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="user_id_seq_gen")
        @Column(name="ID", unique = true, nullable = false)
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        @Column(name="NAME", unique = true, nullable = false)
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Column(name="SURNAME", unique = true, nullable = false)
        public String getSurname() {
            return surname;
        }

        public void setSurname(String surname) {
            this.surname = surname;
        }   

    }

persistence.xml

   <?xml version="1.0" encoding="UTF-8"?>
        <persistence 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" version="2.0">
           <persistence-unit name="testUnit" transaction-type="RESOURCE_LOCAL">
              <provider>org.hibernate.ejb.HibernatePersistence</provider>
              <non-jta-data-source>java:/comp/env/testDS</non-jta-data-source>
              <class>com.user.external.test.User</class>
              <exclude-unlisted-classes>false</exclude-unlisted-classes>
              <properties>
                 <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
                 <property name="hibernate.max_fetch_depth" value="6"/>
                 <property name="hibernate.show_sql" value="false"/>
                 <property name="hibernate.format_sql" value="true"/>
              </properties>
           </persistence-unit>
        </persistence>

Tomcat Server.xml

    <Context docBase="usertools" path="/usertools" reloadable="true">
        <ResourceLink name="testDS" 
                  global="testDS"  
                  type="javax.sql.DataSource"/>
    </Context> 

TestBean.java

    @ManagedBean(name="testBean")
    @ViewScoped
    public class TestBean implements Serializable{

        @ManagedProperty("#{testService}")
        private ITestService testService;

        public void saveData(User user){
            testService.saveUser(user);
        }

        public void setTestService(ITestService testService){
            this.testService = testService;
        }

        public ITestService getTestService(){
            return testService;
        }
    }

TestServiceImpl.java

    @ManagedBean(name="testService")
    @ApplicationScoped
    public class TestServiceImpl implements ITestService {

        @ManagedProperty(value="#{testDAO}")
        private ITestDAO testDAO;

        public void saveUser(User user){
            testDAO.saveUser(user);
        }

        public void setTestDAO(ITestDAO testDAO){
            this.testDAO = testDAO;
        }

        public ITestDAO getTestDAO(){
            return testDAO;
        }

    }   

TestDao.java

    @ManagedBean(name = "testDAO")
    @ApplicationScoped
    public class TestDAO implements ITestDAO {

        @PersistenceContext
        private EntityManager entityManager; // is null

        public void saveUser(User user){
            entityManager.persist(user); // Getting Null Pointer Here....
        }   

        public void setEntityManager(EntityManager entityManager) {
            this.entityManager = entityManager;
        }

        public EntityManager getEntityManager() {
            return entityManager;
        }

    }

@PersistenceContextの名前とunitNameの属性を試してみました。しかし、それでも機能していません。web.xmlのリソース設定でも試してみました

    <persistence-context-ref>
            <persistence-context-ref-name>testUnit</persistence-context-ref-name>
            <persistence-unit-name>testUnit</persistence-unit-name>
        </persistence-context-ref>

        <resource-ref>
            <description>DB Connection</description>
            <res-ref-name>testUnit</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
        </resource-ref>

まだ運がない。誰か助けてくれませんか。

4

1 に答える 1

13

TomcatはJavaEEコンテナーではないため、コンテナー管理のファクトリと依存性注入に関連する制限があります。特に、とを手動で作成する必要がありEntityManagerFactoryますEntityManager

Hibernateのドキュメントはそれについて明確ではないので、ここにEclipselinkの1つがあります:Tomcat/JPAチュートリアル。「JPAの制限」セクションを確認してください。これはHibernateにも同様に適用されます。

参照:

于 2012-06-29T12:34:56.073 に答える