結果クエリを 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 という名前のモデル クラスに入力されます。
これで、データを INSERT してデータベースに新しい 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 のように「name」属性はありません。
<"sql-query"> を使用すると、次のことができます。
Query query =session.getNamedQuery("getProfesors");
前に示したのと同じですが、sql-insert にはその属性名がないため、その方法がわかりません。また、非常に特殊な要件であるため、ストアド プロシージャを使用せざるを得ません。そうしないと、他の Hibernate 永続化機能を使用していたでしょう。
どんな助けでも本当に感謝しています。