2016-04-12 16 views
0

私はここに似た2つのメソッドを持つjavaクラスを持っています。春と休止状態:query.list()は2回以上実行されません

public Object noOfEmployees() { 

     List<Employee> emp = null; 
     String u = user.getUserName(); 

     if ("user1".equals(u)) { 

      Query query = getHibernateTemplate().getSessionFactory().openSession() 
        .createSQLQuery("select * from employee where job='System Analyst'") 
        .addEntity(EMPLOYEE.class); 

      emp = query.list(); 

      getHibernateTemplate().getSessionFactory().openSession().close(); 

     } else if ("user2".equals(u)) { 

      Query query = getHibernateTemplate().getSessionFactory().openSession() 
        .createSQLQuery("select * from employee where job='DBA'") 
        .addEntity(EMPLOYEE.class); 

      emp = query.list(); 
      getHibernateTemplate().getSessionFactory().openSession().close(); 

     } 
     return emp.size(); 
    } 

私はアプリケーションを実行したときに、これは私が出力を得た方法である:

'user2は' としてログイン
  1. 休止状態:従業員からのジョブは= 'DBA' *を選択

    休止状態:選択*従業員から、ここで、ジョブ= 'DBA' とランク= '2'

    休止状態:選択*

    休止 'USER1' としてログイン存在= 'はい'

  2. 従業員から:仕事= 'システムアナリスト'

    Hibernateは、従業員からの選択*:従業員ここで、ジョブから選択* = 「システムアナリスト」とランク=「3」

    休止:*存在=「はい」

  3. は再び、「user2は」としてログインし、従業員から、最初の2つの方法を実行しますを選択します。

    休止状態:選択*従業員から、ここで、ジョブ= 'DBA'

    休止:従業員から選択*ここで、ジョブ= 'DBA' とランク= '2' 私は、任意のユーザとしてログイン

  4. 、今回も最初の方法は実行されませんでした。

私はquery.list()に遭遇したときにコードが立ち往生ことに気づきました。私は、hibernateTemplateを使うことはお勧めしませんが、アプリケーション全体がそれを使って書かれていることを知っています。私は春と冬眠について学び始めました。私は一度それらに慣れると変更を開始します。

query.list()のパフォーマンスに関連する提案や、コードを改善する方法は、歓迎する以上のものです。

ありがとうございました!

+0

あなたはquery.list()が立ち往生したと言ったときの意味を教えてください。 – Lexi

+0

その後、コンソールは何も印刷しませんでした。 – user5776462

答えて

0

非常に古いアプリケーションです。それ以外の場合は平文SessionFactoryを使用してください。詳細については、http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html#orm-hibernate-straightを参照してください。

第2に、Springを使用してリソースを管理する場合(この場合はSession)、または少なくともそれを正しく管理するには、自分でやりたいのですか。

SessionFactoryを短く使用し、openSessionの代わりにgetCurrentSessionを使用してください。適切なクエリを使用します。

@Autowired 
private SessionFactory sf; 

@Transactional 
public Long noOfEmployees() { 
    final String query = "select count(*) from employee where job=:job"; 
    Query q = sf.getCurrentSession().createSQLQuery(query); 
    if ("user1".equals(u)) { 
     q.setParameter("job", "System Analyst"); 
    } else if ("user2".equals(u)) { 
     q.setParameter("job", "DBA"); 
    } 
    return (Long) query.uniqueResult(); 
} 

@Transactionalはあなたのコンテキストで<tx:annotation-driven />を持っているし、適切HibernateTransactionManagerを追加したと仮定すると、春はリソースを管理いたします。

+0

SQLを使用するのではなく、Hibernateの読み方とHQLの使い方を強くお勧めします。あなたがすでにあなたのために冬眠していることをやろうとしているので、あなたは基本的に休止状態ではなく冬眠のまわりで働いています。 –

+0

さようなら!私が試してみます。 – user5776462

+0

非常に@ v.ladynevと@ M.Deinumありがとう! :) – user5776462

0

問題、明らかに、このgetHibernateTemplate().getSessionFactory().openSession().close()でこのコード

Query query = getHibernateTemplate().getSessionFactory().openSession(). 

... 
getHibernateTemplate().getSessionFactory().openSession().close(); 

では、新しいセッションを取得し、それを閉じます!

あなたは

HQL

Query query = session.createQuery("from Employee where job='System Analyst'"); 
List<Employee> emp = query.list(); 
を使用する必要がありますそして、あなたは Hibernate Templateを使用する方法は完全に間違っています。

は、使用方法を参照してください、それ

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/classic-spring.html

あなたがしている場合を除きあなたのコードは、あなたが HibernateTemplateを使用すべきではない手始めに...多くのレベルで欠陥がある
public class ProductDaoImpl { 

    private HibernateTemplate hibernateTemplate; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     this.hibernateTemplate = new HibernateTemplate(sessionFactory); 
    } 

    public Collection loadProductsByCategory(final String category) throws DataAccessException { 
     return this.hibernateTemplate.execute(new HibernateCallback() { 
      public Object doInHibernate(Session session) { 
       Criteria criteria = session.createCriteria(Product.class); 
       criteria.add(Expression.eq("category", category)); 
       criteria.setMaxResults(6); 
       return criteria.list(); 
      } 
     }; 
    } 

} 
+0

@Mahi複雑な例を使用します。私はもっ​​と簡単に更新します。 –

0

私は、多少のレベルのコードにある程度変更を加えました。迅速な対応のため、@ M.Deinumと@ v.ladynevに感謝します。 HibernateTemplateからのSessionFactoryに変更しながら、私が出会った

//IndexService 

    @Transactional 
    public class IndexService { 

     User user; 
     SessionFactory sf; 

     public IndexService(User user, SessionFactory sf) { 

      this.user = user; 
      this.sf = sf; 
     } 

    //This method is used to get the number of employees based on users. 

    public Object noOfEmployees() { 

     String u = user.getUserName(); 

     final String query = "select count(*) from employee where job=:job"; 

     Query q = sf.getCurrentSession().createSQLQuery(query); 

     if ("user1".equals(u)) { 

      q.setParameter("job", "System Analyst"); 

     } else if ("user2".equals(u)) { 

      q.setParameter("job", "DBA"); 

     } 
     return q.uniqueResult(); 
    } 
    -------------------------------------------------------------------------------------- 
    //Index 

    @Controller 
    @Transactional 
    public class Index { 

     @Autowired 
     User user; 
     @Autowired 
     SessionFactory sf; 

     @RequestMapping("/index") 
     public ModelAndView getIndex() { 

      System.out.println("user.getUserName() In Index = " + user.getUserName()); 

      ModelAndView modelAndView = new ModelAndView("index"); 

      IndexService indexService = new IndexService(user, sf); 

      modelAndView.addObject("noOfEmployees", indexService.noOfEmployees()); 

      return modelAndView; 
     } 
    } 
    -------------------------------------------------------------------------------------- 
    //spring-servlet.xml 

    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> 


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

     <bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
      <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
      <property name="url" 
       value="jdbc:mysql://localhost/database_name"></property> 
      <property name="username" value="user"></property> 
      <property name="password" value="password"></property> 
     </bean> 

     <bean id="sessionFactory" 
      class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
      <property name="dataSource" ref="basicDataSource"></property> 

      <property name="mappingResources" value="myBeans.hbm.xml" /> 

      <property name="hibernateProperties"> 
       <props> 
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
        <prop key="hibernate.hbm2ddl.auto">update</prop> 
        <prop key="hibernate.show_sql">true</prop> 
       </props> 
      </property> 
     </bean> 


<bean id="transactionManager" 
      class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
      <property name="sessionFactory" ref="sessionFactory" /> 
     </bean> 

    </beans> 

問題:SessionFactoryの

ため

1.NullPointerExceptionを下記の

はSessionFactoryのへのHibernateTemplateから移動するための変更が記載されている唯一のスニペットです

インデックスクラス内、

@Autowired SessionFacto ry sf;

を引数として渡します。

IndexService indexService = new IndexService(user、sf);

2.No HibernateのSessionはスレッドにバインド、およびコンフィギュレーションは、私はまた、インデックスの上に@Transactionalを入れ、ここで、非トランザクション1

を作成することはできません。私のアプリケーションのコントローラです。

もう一度@ M.Deinumと@ v.ladynevありがとうございました!

関連する問題