2017-05-02 2 views
0

私はスタンドアロンJavaアプリケーションでHibernate + Springを統合しようとしていますが、データベース操作は機能しませんが、私はコード/設定に何が欠けているのか分からないので、私はグーグルでいくつかの研究をしましたが、私の問題を解決するものは見つけられませんでした。だから誰かが私を助けることができるように私は自分のコード/設定を投稿しています。スプリングマネージドEntityManagerを使用してデータを保持することができません

エンティティクラス:

 package com.entity; 

     import javax.persistence.Column; 
     import javax.persistence.Entity; 
     import javax.persistence.GeneratedValue; 
     import javax.persistence.GenerationType; 
     import javax.persistence.Id; 
     import javax.persistence.Table; 

     @Entity 
     @Table(name = "employee") 
     public class Employee { 

       @Id 
       @GeneratedValue(strategy = GenerationType.AUTO) 
       @Column(name = "EMP_ID") 
       private Integer empoyeeId; 

       @Column(name = "EMP_NAME") 
       private String employeeName; 

       public Integer getEmpoyeeId() { 
        return this.empoyeeId; 
       } 

       public void setEmpoyeeId(Integer empoyeeId) { 
        this.empoyeeId = empoyeeId; 
       } 

       public String getEmployeeName() { 
        return this.employeeName; 
       } 

       public void setEmployeeName(String employeeName) { 
        this.employeeName = employeeName; 
       } 
     } 

DAOクラス

package com.dao.impl; 

    import javax.persistence.EntityManager; 

    import com.dao.IEmployeeDao; 
    import com.entity.Employee; 

    public class EmployeeDao implements IEmployeeDao { 

     private static final Logger LOGGER = 
        LogManager.getLogger(EmployeeDao.class); 

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

     @Override 
     public Employee create(Employee aEmployee) { 
      return this.em.merge(aEmployee); 
     } 

     @Override 
     public Employee fetchEmployeeById(Integer aEmployeeId) { 
     return this.em.find(Employee.class, aEmployeeId); 
     } 
    } 

メインクラス:フェッチしようとしたとき、私は、nullポインタ例外を取得しています上記のクライアントコードと

package com.client; 

    import org.apache.logging.log4j.LogManager; 
    import org.apache.logging.log4j.Logger; 
    import org.springframework.beans.BeansException; 
    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.support.ClassPathXmlApplicationContext; 

    import com.dao.IEmployeeDao; 
    import com.entity.Employee; 

    public class Client { 
      private static final Logger LOGGER = LogManager.getLogger(Client.class); 

      public static void main(String[] args) throws BeansException, 
        Exception { 
        ApplicationContext applicationContext = new 
        ClassPathXmlApplicationContext("applicationcontext.xml"); 
        LOGGER.info("client invoked"); 
        IEmployeeDao employeeDao = 
        (IEmployeeDao)applicationContext.getBean("employeeDao"); 
        Employee employee = new Employee(); 
        employee.setEmployeeName("Suraj Kumar"); 
        employee = employeeDao.create(employee); 
        employee =       
        employeeDao.fetchEmployeeById(employee.getEmpoyeeId()); 
        //getting null pointer here as employee is null 

        //  EntityManagerFactory emf = 
          Persistence.createEntityManagerFactory("testPU"); 
        //  EntityManager em = emf.createEntityManager(); 
        //  em.getTransaction().begin(); 
        //  EmployeeDao employeeDao = new EmployeeDao(); 
        //  employeeDao.setEm(em); 
        //  Employee employee = new Employee(); 
        //  employee.setEmployeeName("Suraj Kumar"); 
        //  employee = employeeDao.create(employee); 
        //  employee = 
        employeeDao.fetchEmployeeById(employee.getEmpoyeeId()); 
        //  em.getTransaction().commit(); 
        //  em.close(); 
        //  emf.close(); 
      } 
    } 

createを呼び出すことによって返された従業員のIDが従業員である場合、nullを返します。これは、recor dは持続しなかった。

しかし、私は上記のコメントを外したコードをコメントアウトし、今コメントされているコードのコメントを外して、つまり春を使わずに休止状態のみを使用しているときはすべて正常に動作します。私は以下の設定ファイルを提供しました。

applicationContext.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="testPU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.entity.Employee</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.connection.url" 
       value="jdbc:mysql://localhost:3306/dbname"/> 
     <property name="hibernate.connection.driver_class" 
       value="com.mysql.jdbc.Driver"/> 

     <property name="hibernate.dialect" 
       value="org.hibernate.dialect.MySQLDialect"/> 
     <property name="hibernate.connection.username" value="user"/> 
     <property name="hibernate.connection.password" value="password"/> 
     <property name="hbm2ddl.auto" value="update"/> 
     </properties> 
    </persistence-unit> 
    </persistence> 

persistence.xmlの

<?xml version="1.0" encoding="UTF-8"?> 
    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd "> 
    <import resource="aspects.xml"/> 

     <bean class="org.springframework.orm.jpa.support. 
        PersistenceAnnotationBeanPostProcessor"/> 

     <bean id="myEmf" 
     class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"> 
      <property name="persistenceUnitName" value="testPU"/> 
     </bean> 

     <bean id="employeeDao" class="com.dao.impl.EmployeeDao" /> 

    </beans> 

私はまた、側面を使用していますが、私はわからないように、その関連する場合、私は回してみましたように私は、コードを投稿していません私はこの問題に直面していますが、ちょうど1つの奇妙なことが、nullポインタ例外を取得する代わりに、アスペクトをオフにしてしまいます。この場合、EntityManagerクラスのfindメソッドの中から別の例外が発生します。ダオ級nullを返さない

誰かが私にそれを手伝ってもらえますか?

+0

人を聖霊降臨祭の誰もがしてください助けることができますか? –

答えて

1

あなたの取引はコミットされていないようです。トランザクションを処理し、そのメソッドに注釈を付けるためのサービス層を作成し、より良い、EmployeeDaoクラスであなたのメソッドに@Transactionalを追加したり、

てみ@Transactional

+0

フェッチするメソッドが読み込み専用のメソッドであるため、私のDAOクラスのcreateメソッドで@Transactionalを追加しましたが、まだNULLポインタを取得していますexceptio –

+0

ちょうどもう一つのポイントです。私は

+0

、トランザクション内で実行されていないメソッドが問題でした。私は問題に直面していたいくつかの他の問題がありましたが、作業がうまくいかないためには主な理由はトランザクションの振る舞いが欠けていました。私はあなたの答えを受け入れたとマークしました –

関連する問題