0

Ich konnte eine Stored Procedure in Hibernate ausführen, um die Ergebnisabfrage in eine Java Bean zu mappen.Wie führe ich SQL Server Stored Procedure für INSERT aus Hibernate aus?

Zum Beispiel habe ich diese Datei mit dem Namen 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> 

Und dann in meiner Profesor Klasse Ich habe den folgenden Code:

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

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

    query.setString("idTT", idTT); 

return query.list(); 
} 

Das funktioniert perfekt, ich habe Kein Problem, die gespeicherte Prozedur wird ausgeführt und es füllt meine Modellklasse namens Profesor mit den Ergebnissen.

Jetzt habe ich eine andere gespeicherte Prozedur, die Daten einfügt, um einen neuen Profesor in der Datenbank zu erstellen.

habe ich versucht, so etwas wie dies ohne Erfolg:

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(); 

Es macht mir nicht einmal eine Fehlermeldung anzeigen, werden die Daten einfach nicht einfügen. Ich habe auch gelesen, dass genau wie es ein < "sql-query"> -Tag gibt, gibt es eine < "sql-einfügen"> , aber dann kann ich nicht den Weg zu rufen, dass < "sql-insert"> weil es kein "name" -Attribut wie sql-query hat.

Mit < „SQL-Abfrage“> wir tun könnten:

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

Genau wie ich schon gezeigt, aber da SQL-Insert tut das Attribut Namen ich nicht weiß, wie es zu tun. Ich bin auch gezwungen, gespeicherte Prozeduren zu verwenden, da dies eine sehr spezielle Anforderung ist, sonst hätte ich andere Persistenzfunktionen von Hibernate verwendet.

Jede Hilfe würde wirklich geschätzt werden.

+0

Es ist sehr kompliziert, das ORM zu konfigurieren, um gespeicherte Prozeduren für alles zu verwenden. Ich meine nur, dass du das nicht freiwillig tun solltest. –

Antwort

0

Eine weitere Möglichkeit ist das Abrufen des gespeicherten Proc aus einer vorbereiteten Anweisung. Dies ist möglicherweise nützlich, wenn die gespeicherte Prozedur mehr als einen Datensatz aktualisiert (Stapelaktualisierungen).

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

Bitte beachten Sie aber: Hibernate Sitzungen Verbindung() -Methode, da Hibernate 3.2.4 veraltet ist (https://hibernate.onjira.com/browse/HHH-2603) Eine Alternative zu diesem deprecation vorübergehend, wir verwenden können:

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

Sie können "custom sql" zum Einfügen, Aktualisieren und Löschen angeben. Siehe the documentation darüber.

Dies sind keine benannten Abfragen. Sie werden immer verwendet, wenn Hibernate diese Entität einfügt, aktualisiert oder löscht.

+0

überprüfte ich, dass die Dokumentation und ich versuchte, meine Profesor.hbm.xml Änderung dieser Codezeile hinzu: {(????,,,,) Nennen addProfesor} innerhalb der Tag, aber ich weiß nicht, wie ich es aus meinem Java-Code aufrufen, bitte helfen –

+0

Ich kann kein Beispiel dafür finden, könnten Sie mich irgendwo führen? –

+0

Sie rufen es nicht direkt von Java an. Es wird immer aufgerufen, wenn die Entität eingefügt wird. –

Verwandte Themen