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