1

Hibernate Session のdoWork()メソッドは、 への直接アクセスを提供しjava.sql.Connectionます。

PreparedStatement以下は、シーケンスを生成するために作成して実行する方法の 1 つです。

public Long generateId() {
    final Long id[] = { null };

    getSessionFactory().openSession().doWork(new Work() {
        public void execute(Connection connection) throws SQLException {
            PreparedStatement ps = connection
                    .prepareStatement("SELECT HIB_SEQ.nextval FROM DUAL");
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                id[0] = rs.getLong(0);
            }
        }
    });
    return id[0];
}

まず、これを行うためのより良い方法はありますか?

2 番目の Q で作成したものを明示的に閉じる必要がありPreparedStatementますか?

4

3 に答える 3

1

のインスタンスはPreparedStatementメソッドの一部として作成されるWork.executeため、クローズを含め、そのスコープ内で処理する必要があります (変数psがスコープ外になるため、インスタンス自体はメソッドの実行が終了すると GC によって収集されますが、開いているカーソルなどの外部リソースはすべて明示的な呼び出しが必要ですps.close())。

一方、のインスタンスはConnectionHibernate によってメソッドに渡され、手動で閉じてはなりません。これは Hibernate の責任です。

于 2012-05-24T12:33:53.043 に答える
1

1)値を返すために使用できますdoReturningWork

public int updateEmployeeStatusWithCount(final List<String> employeeList) throws DBException
{
       Session session = null;
       try
       {
              session = HibernateUtil.getSession();
              session.beginTransaction();
              int cnt = session.doReturningWork(new ReturningWork<Integer>() {
                     @Override
                     public Integer execute(Connection conn) throws SQLException {
                           PreparedStatement pStmt = null;
                           try
                           {
                                  int updatedCnt = 0;
                                  String sqlQry = "UPDATE EMP_DETAILS set IS_ACTIVE='N' WHERE EMP_ID=?";
                                  pStmt = conn.prepareStatement(sqlQry);
                                  for(String empId:employeeList)
                                  {
                                         System.out.println(empId);
                                         pStmt.setString(1, empId);
                                         int cnt = pStmt.executeUpdate();
                                         updatedCnt+=cnt;
                                  }
                                  return updatedCnt;
                           }
                           finally
                           {
                                  pStmt.close();
                           }                                
                     }
              });
              session.getTransaction().commit();
              return cnt;
       }
       catch(HibernateException e)
       {
              throw new DBException("Error occured while updating Employee Status",e);
       }
       finally
       {
              HibernateUtil.closeSession(session);
       }            
}

2) はい 明示的に閉じる必要がありPreparedStatement ます。以下の例を参照してください。

public void updateEmployeeStatus(final List<String> employeeList) throws DBException
{
       Session session = null;
       try
       {
              session = HibernateUtil.getSession();
              session.beginTransaction();
              session.doWork(new Work() {
                     @Override
                     public void execute(Connection conn) throws SQLException {
                           PreparedStatement pStmt = null;
                           try
                           {
                                  String sqlQry = "UPDATE EMP_DETAILS set IS_ACTIVE='N' WHERE EMP_ID=?";
                                  pStmt = conn.prepareStatement(sqlQry);
                                  for(String empId:employeeList)
                                  {
                                         pStmt.setString(1, empId);
                                         pStmt.addBatch();
                                  }
                                  pStmt.executeBatch();
                           }
                           finally
                           {
                                  pStmt.close();
                           }                                
                     }
              });
              session.getTransaction().commit();
       }
       catch(HibernateException e)
       {
              throw new DBException("Error occured while updating Employee Status",e);
       }
       finally
       {
              HibernateUtil.closeSession(session);
       }            
}

参照

于 2014-11-21T08:55:40.297 に答える
0
    String query = ((SessionFactoryImplementor)sessionFactory).getDialect().getSequenceNextValString(seqName);
    Session session = sessionFactory.getCurrentSession();
    return (Long) session.createSQLQuery(query).addScalar("nextval", Hibernate.LONG).uniqueResult();

データベースの列名と戻り値のタイプに合うように、スカラー部分を少し微調整することをお勧めします。

于 2012-05-24T11:16:56.413 に答える