Session -> null Spring & Hibernate
Que tal chavos, ya tenía rato que no preguntaba algo jejeje, pero aquí estoy de nuevo, después de trabajar con Struts1 un poco con Struts2, decidí que ya era hora de entrar a las grandes ligas jejeje por lo cual estoy haciendo un proyecto con JSF + Spring + Hibernate y me he encontrado con el primer obstáculo, en estas tecnológias soy nuevo tanto en Spring y JSF.
Bueno el problema que tengo es al obtener una session de Hibernate, me marca un NullPointerException ya he buscado en varios sitios pero no logro dar con la solución, cabe mencionar que ya revise un post anterior http://www.javamexico.org/foros/java_enterprise/hibernate_spring pero aún así no doy con la respuesta.
Les pongo algo de mi código:
Config-Spring.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
<a href="http://www.springframework.org/schema/beans/spring-beans.xsd
" title="http://www.springframework.org/schema/beans/spring-beans.xsd
">http://www.springframework.org/schema/beans/spring-beans.xsd
</a> <a href="http://www.springframework.org/schema/context
" title="http://www.springframework.org/schema/context
">http://www.springframework.org/schema/context
</a> <a href="http://www.springframework.org/schema/context/spring-context.xsd
" title="http://www.springframework.org/schema/context/spring-context.xsd
">http://www.springframework.org/schema/context/spring-context.xsd
</a> <a href="http://www.springframework.org/schema/tx
" title="http://www.springframework.org/schema/tx
">http://www.springframework.org/schema/tx
</a> <a href="http://www.springframework.org/schema/tx/spring-tx.xsd
" title="http://www.springframework.org/schema/tx/spring-tx.xsd
">http://www.springframework.org/schema/tx/spring-tx.xsd
</a> <a href="http://www.springframework.org/schema/mvc
" title="http://www.springframework.org/schema/mvc
">http://www.springframework.org/schema/mvc
</a> <a href="http://www.springframework.org/schema/mvc/spring-mvc.xsd
" title="http://www.springframework.org/schema/mvc/spring-mvc.xsd
">http://www.springframework.org/schema/mvc/spring-mvc.xsd
</a> ">
<context:annotation-config/>
<context:component-scan base-package="com.rt" />
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="resolvedorVistas"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/vistas/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url" value="jdbc:sqlserver://xx.xx.xx.xxx\SQLSERVER2008;databaseName=TestJava" />
<property name="username" value="Java" />
<property name="password" value="aaaaaa" />
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="annotatedClasses">
<list>
<value>com.rt.beans.Seccion</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>
<bean id="hibInterceptor" class="org.springframework.orm.hibernate3.HibernateInterceptor">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>
<bean id="miDAO" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="frozen" value="true" />
<property name="proxyInterfaces" value="com.rt.dao.SeccionDAO" />
<property name="target">
<bean class="com.rt.dao.SeccionDAOImpl">
<property name="sessionFactory" ref="mySessionFactory" />
</bean>
</property>
<property name="interceptorNames"><list>
<value>hibInterceptor</value>
</list></property>
</bean>
</beans>
SeccionDAO.java
public void saveOrUpdateSeccion(Seccion seccion);
}
SeccionDAOImpl.java
public class SeccionDAOImpl extends HibernateDaoSupport implements SeccionDAO{
public SeccionDAOImpl() {
}
@Autowired
public SeccionDAOImpl(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
@Transactional
public void saveOrUpdateSeccion(Seccion seccion) {
System.out.println("Seccion Descripcion -> " + seccion.getDescripcion());
try{
getHibernateTemplate().saveOrUpdate(seccion);
}catch (Exception e) {
e.printStackTrace();
}
}
}
Seccion.java
@Entity
@Table(name="Seccion")
public class Seccion implements Serializable{
private static final long serialVersionUID = 1L;
private Integer id;
private String descripcion;
public Seccion() {}
@Id
@GeneratedValue
@Column(name="id")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="descripcion")
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
}
Espero algunas ideas para saber dónde estoy mal. De antemano muchas gracias.
- Inicie sesión o regístrese para enviar comentarios
no se si sea la mejor forma
No sé si sea la mejor forma pero ya solucioné mi problema, para empezar decidí hacer un proyecto nuevo pero sin anotaciones, esto para comprender lo básico y me funcionó =) después lo implementé en el proyecto original y vualá con pocas modificaciones funcionó con anotaciones, les pongo como quedaron los archivos mejorados jejeje por si a alguién le interesa. Cabe mencionar que la clave es leer y leer para poder comprender =D.
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
<a href="http://www.springframework.org/schema/beans/spring-beans.xsd
" title="http://www.springframework.org/schema/beans/spring-beans.xsd
">http://www.springframework.org/schema/beans/spring-beans.xsd
</a> <a href="http://www.springframework.org/schema/context
" title="http://www.springframework.org/schema/context
">http://www.springframework.org/schema/context
</a> <a href="http://www.springframework.org/schema/context/spring-context.xsd
" title="http://www.springframework.org/schema/context/spring-context.xsd
">http://www.springframework.org/schema/context/spring-context.xsd
</a> <a href="http://www.springframework.org/schema/tx
" title="http://www.springframework.org/schema/tx
">http://www.springframework.org/schema/tx
</a> <a href="http://www.springframework.org/schema/tx/spring-tx.xsd
" title="http://www.springframework.org/schema/tx/spring-tx.xsd
">http://www.springframework.org/schema/tx/spring-tx.xsd
</a> <a href="http://www.springframework.org/schema/mvc
" title="http://www.springframework.org/schema/mvc
">http://www.springframework.org/schema/mvc
</a> <a href="http://www.springframework.org/schema/mvc/spring-mvc.xsd
" title="http://www.springframework.org/schema/mvc/spring-mvc.xsd
">http://www.springframework.org/schema/mvc/spring-mvc.xsd
</a> ">
<context:annotation-config/>
<context:component-scan base-package="com.rt" />
<mvc:annotation-driven/>
<bean id="resolvedorVistas"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/vistas/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="url" value="jdbc:sqlserver://xx.xx.xxx.xxx\SQLSERVER2008;databaseName=TestJava" />
<property name="username" value="Java" />
<property name="password" value="aaaaaa" />
</bean>
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="annotatedClasses">
<list>
<value>com.rt.beans.Seccion</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
<prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
<prop key="hibernate.c3p0.acquire_increment">1</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.max_size">20</prop>
<prop key="hibernate.c3p0.timeout">100</prop>
<prop key="hibernate.c3p0.max_statements">20</prop>
<prop key="hibernate.c3p0.idle_test_period">100</prop>
</props>
</property>
</bean>
<bean id="seccionDAOB" class="com.rt.dao.SeccionDAOImpl">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
</beans>
SeccionDAO.java
public void save(Seccion seccion);
}
SeccionDAOImpl.java
public class SeccionDAOImpl implements SeccionDAO{
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Transactional
public void save(Seccion seccion) {
Session session = sessionFactory.getCurrentSession();
try{
session.beginTransaction();
session.save(seccion);
session.getTransaction().commit();
}catch (Exception e) {
e.printStackTrace();
}
}
}
Seccion.java | queda igual
SeccionController. java
public class SeccionController {
@Autowired(required=true)
Seccion seccion;
@RequestMapping(value="/addSeccion.sts")
public ModelAndView handlerRequest(HttpServletRequest request,
HttpServletResponse response){
return new ModelAndView("guardarSeccion", "seccion", seccion);
}
@RequestMapping(value="/addingSeccion.sts")
public ModelAndView handlerRequests(HttpServletRequest request,
HttpServletResponse response, Seccion seccions){
ApplicationContext appContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
SeccionDAO seccionDAO = (SeccionDAO) appContext.getBean("seccionDAOB");
seccionDAO.save(seccions);
return new ModelAndView("successSeccion");
}
}
El problema que tenia era que no podía crear una session de hibernate a través de la configuración de spring, la clave es el ApplicationContext con la cual obtenemos una instancia del mismo para poder sacar el bean, en este caso seccionDAOB el cúal fué inyectado por spring con un sessionFactory, la pregunta que tengo es que: siempre tengo que crear beans, ponerlos en el applicationContext de spring, inyectarles mi sessionFactory para poder manejar las transacciones? existe otra forma más fácil?
parece que ignora el pool c3p0, como puedo saber si lo esta utilizando mi configuración o esta utilizando el pool que trae por default Hibernate?
Saludos