7 de enero de 2009

Store procedure en spring 2.0 (integrado con Hibernate)

Hay diferentes maneras en spring para hacer una llamada a un store procedure

El link que ven arriba, hace una llamada a un store procedure haciendo uso de StoredProcedure, clase de Spring que provee de soporte para los Stored Procedures.

Hay un problema con usar este método, ya que por razones de adaptabilidad de la aplicación (y para hacerlo mas fácil dicho sea de paso), me incline por el método siguiente:
public class CallProcedureHibernate extends HibernateDaoSupport implements CallProcedureDAO{
JdbcTemplate jdbcTemplate;

public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void ProcessBonus(){
CallableStatementCallback cb = new CallableStatementCallback() {
public Object doInCallableStatement(CallableStatement cs)
throws SQLException, DataAccessException{
cs.execute();
return null;
}
};
jdbcTemplate.execute("{ call SP_CALCULA() }", cb);
}
}

Eso es todo lo que tienen que hacer para llamar a un procedure sin valores de entrada ni salidas.

Logicamente se tiene que tener su services, dao y sus implementaciones, en el archivo de configuracion de hibernate ponemos lo siguiente:
<bean id="CallProcedureDAO" class="app.compensations.dao.hibernate.CallProcedureHibernate">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="dataSource" ref="DataSource"/>
</bean>

Aqui tenemos configurado nuestro DAO, que hace referencia a nuestra clase que llama al Store procedure, logicamente debemos de tener nuestro Beans sessionFactory y DataSource. El primero se encarga de decir al sistema donde se encuentran todos los ficheros de mapeo de Hibernate, el dialecto de Hibernate a utilizar y también va a ser la encargada de asociar los DAO dentro de las Fachadas; El segundo definiremos un datasource con los valores de conexion a la BD o con jndi, segun sea el caso.

2 comentarios:

Lennon Shimokawa dijo...

Por qué prefieres utilizar HibernateDaoSupport para llamar StoreProcedures? personalmente la clase StoreProcedure de Spring JDBC me parece más limpia, Hibernate es un ORM.

Edwin Farfan dijo...

Tienes razon Lennon, sin duda el StoreProcedure es mucho mas limpio que utilizar HibernateDaoSupport. A mi favor tengo que decir que esta aplicacion estaba diseñada con hibernate y faces y para no romper con este diseño decidi integrarlo con hibernate (como bien dije... hay diferentes maneras). Incluso se puede hacer lo mismo con hibernate, pero llamar un store procedure con Spring me parecio mas simple que con hibernate.
Saludos.