Sql server 如何从Hibernate执行用于插入的SQL Server存储过程?

Sql server 如何从Hibernate执行用于插入的SQL Server存储过程?,sql-server,sql-server-2008,hibernate,stored-procedures,jdbc,Sql Server,Sql Server 2008,Hibernate,Stored Procedures,Jdbc,我已经能够在hibernate中执行一个存储过程,将结果查询映射到JavaBean中 例如,我有一个名为Profesor.hbm.xml的文件: <hibernate-mapping> <class name="model.Profesor" table="Profesor" catalog="dbo"> <id name="idProfesor" type="int"> <colu

我已经能够在hibernate中执行一个存储过程,将结果查询映射到JavaBean中

例如,我有一个名为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>
它甚至没有向我显示错误消息,数据就是无法插入。 我还读到,就像有一个标签,有一个 但是我看不到调用它的方法,因为它不像sql查询那样具有“name”属性

有了这些,我们可以做:

 Query query =session.getNamedQuery("getProfesors");
正如我之前所展示的,但是由于sql insert没有那个属性名,我不知道如何做。我还被迫使用存储过程,因为这是一个非常特殊的要求,否则我会使用其他Hibernate持久性特性

非常感谢您的帮助。

您可以为插入、更新和删除指定“自定义sql”。看看吧


这些不是命名查询。当Hibernate插入、更新或删除此实体时,始终使用它们。

另一种方法是从准备好的语句调用存储的proc。如果存储过程更新多个记录(批更新),这可能非常有用

但请注意:自hibernate 3.2.4()以来,hibernate会话的connection()方法已被弃用 我们可以暂时使用以下替代方法:

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

将ORM配置为使用存储过程处理所有事情是非常复杂的。我的意思是你不应该选择这样做。我检查了文档,并尝试修改我的Profesor.hbm.xml,在标记中添加以下代码行:{call addProfesor(?,,,,?,?)},但我不知道如何从Java代码中调用它,请帮助我,我找不到任何这样的示例,你能带我去个地方吗?你不是直接从java叫它的。插入实体时,始终会调用它。
 Query query =session.getNamedQuery("getProfesors");
PreparedStatement ps = getSession().connection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();
PreparedStatement ps = ((SessionFactoryImplementor)sessionFactory).getConnectionProvider()
                    .getConnection().prepareStatement("{exec sp_batchRateUpdate}");
ps.execute();