0

我已經能夠在hibernate中執行存儲過程來將結果查詢映射到Java Bean中。如何從Hibernate執行INSERT的SQL Server存儲過程?

例如,我有這個文件稱爲Profesor.hbm.xml:

<hibernate-mapping> 
     <class name="model.Profesor" table="Profesor" catalog="dbo"> 
      <id name="idProfesor" type="int"> 
       <column name="idProfesor" /> 
       <generator class="assigned" /> 
      </id> 
     <property name="Nombre" type="string"> 
      <column name="Nombre" length="25" not-null="false" /> 
     </property> 
     <property name="ApellidoP" type="string"> 
      <column name="ApellidoP" length="20" not-null="false" /> 
     </property> 

     <property name="ApellidoM" type="string"> 
      <column name="ApellidoM" length="20" not-null="false" /> 
     </property> 
      </class> 

     <sql-query name="getProfesors" callable="true"> 
     <return alias="getProfesors" class="model.Profesor"> 

     <return-property name="idProfesor" column="idProfesor"/> 
     <return-property name="Nombre" column="Nombre"/> 
     <return-property name="ApellidoP" column="ApellidoP"/> 
     <return-property name="ApellidoM" column="ApellidoM"/> 
     </return> 
     exec getProfesors :idTT 
     </sql-query> 
</hibernate-mapping> 

然後在我的PROFESOR類我有以下代碼:

SessionFactory sf = new Configuration().configure().buildSessionFactory(); 
session = sf.getCurrentSession(); 

public List <Profesor> getProfesors(String idTT){ 
    session.beginTransaction(); 

    query.setString("idTT", idTT); 

return query.list(); 
} 

此作品完美,我有沒問題,存儲過程會執行,並將結果填入名爲Profesor的模型類。

現在我有另一個存儲過程插入數據在數據庫中創建一個新的Profesor。

我想這樣的事情沒有成功:

session.beginTransaction(); 
Connection c = session.connection(); 
CallableStatement cs = c.prepareCall("{call addProfesor(?,?,?)}") ; 
cs.setString(1, "George"); 
cs.setString(2, "Williams"); 
cs.setString(3, "Mathematics"); 

cs.executeUpdate(); 

,它甚至沒有告訴我一個錯誤信息,數據就不會插入。 我也讀取只是想有一個<「SQL查詢」>標籤,有一個<「的SQL插入」> 但我看不到的方式來調用<「SQL-插入」>因爲它沒有像sql-query那樣的「name」屬性。

隨着<「SQL查詢」>我們可以這樣做:

Query query =session.getNamedQuery("getProfesors"); 

就像我之前表現,但由於SQL-插入可是沒有這個屬性的名字,我不知道該怎麼做。我也被迫使用存儲過程,因爲它是一個非常特殊的要求,否則我會使用其他Hibernate持久性功能。

任何幫助將非常感激。

+0

這是非常很難配置ORM使用存儲過程來處理所有事情。我只是說你不應該這樣做。 – 2012-04-05 05:23:18

回答

0

另一種方法是從預處理語句中調用存儲過程。如果存儲過程更新多個記錄(批量更新),這可能很有用。

PreparedStatement ps = getSession().connection().prepareStatement("{exec sp_batchRateUpdate}"); 
ps.execute(); 

請注意,雖然:冬眠會議連接()方法已經被廢棄因爲Hibernate 3.2.4(https://hibernate.onjira.com/browse/HHH-2603) 這個棄用暫時的替代,我們可以使用:

PreparedStatement ps = ((SessionFactoryImplementor)sessionFactory).getConnectionProvider() 
        .getConnection().prepareStatement("{exec sp_batchRateUpdate}"); 
ps.execute(); 
1

您可以爲插入,更新和刪除指定「自定義sql」。關於它,請參閱the documentation

這些不是命名查詢。它們總是在Hibernate插入,更新或刪除這個實體時使用。

+0

我檢查了文檔,並且嘗試修改我的Profesor.hbm.xml添加以下代碼行: {call addProfesor(?,?,?,?,?)} 裏面的標籤,但後來我不知道如何從我的Java代碼中調用它,請幫忙 – 2012-04-05 06:59:58

+0

我找不到任何這樣的例子,你能帶我到什麼地方嗎? – 2012-04-05 07:10:29

+0

你不直接從java調用它。它總是在實體插入時被調用。 – 2012-04-11 06:22:26