我已经能够在 hibernate 中执行存储过程以将结果查询映射到 Java Bean。
例如,我有一个名为 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>
然后在我的教授课程中,我有以下代码:
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-query"> 标记,有一个 <"sql-insert"> 但是我看不到调用那个 <"sql-insert"> 的方法,因为它没有像 sql-query 那样的“名称”属性。
使用 <"sql-query"> 我们可以这样做:
Query query =session.getNamedQuery("getProfesors");
就像我之前展示的那样,但是由于 sql-insert 没有该属性名称,我不知道该怎么做。我也被迫使用存储过程,因为这是一个非常特殊的要求,否则我会使用其他 Hibernate 持久性功能。
任何帮助将非常感激。