Spring 2.5 annotation com HibernateDaoSupport Boas Práticas

4 respostas
rpffoz

Olá Senhores,

Em meus DAO’s hibernate eu extendo de HibernateDaoSupport e estou migrando para o uso de annotations
só que surgiu uma dúvida ao anotar o setter do sessionFactory, como posso fazer isso sendo que no xml eu faria assim:

<!-- SessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

		<property name="dataSource">
			<ref local="dataSource" />
		</property>

		<!-- Pega todos os HBMs -->
		<property name="mappingDirectoryLocations">
			<list>
				<value>
					classpath:com/digows/Savior/dao/hibernate/hbm/
				</value>
			</list>
		</property>

		<!-- Carrega o arquivo hibernate.cfg.xml -->
		<property name="configLocation">
			<value>
				/com/digows/Savior/dao/hibernate/hibernate.cfg.xml
			</value>
		</property>
	</bean>

	<!-- Transaction Manager -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>

	<bean id="txProxyTemplate" abstract="true"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

		<property name="transactionManager">
			<ref local="transactionManager" />
		</property>

		<property name="transactionAttributes">
			<props>
				<prop key="*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
	</bean>
	

	<bean id="categoriaDao" class="com.digows.Savior.model.repository.hibernate.CategoriaHibernateDao">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>

Como posso fazer o Bean CategoriaHibernateDAO com o uso de annotations?

4 Respostas

rodrigo_corinthians

Se vc vai usar annotations entaum seu dao precisa estender JpaDaoSupport, segue exemplo do applicationContext.






<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean
            class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL" />
            <property name="showSql" value="true" />
        </bean>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory"  ref="entityManagerFactory" />
</bean>

<!-- Nome(ou parte) dos métodos e suas respectivas transações -->
<bean id="transactionAttributeSource" 
	class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
    <property name="properties">
        <value>
            create*=PROPAGATION_REQUIRED,-Exception
            save*=PROPAGATION_REQUIRED,-Exception
            remove*=PROPAGATION_REQUIRED,-Exception
            get*=PROPAGATION_REQUIRED, -Exception, readOnly
        </value>
    </property>
</bean>

<bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
	<property name="transactionManager">
		<ref bean="transactionManager"/>
	</property>
	<property name="transactionAttributeSource">
		<ref bean="transactionAttributeSource"/>
	</property>
</bean>

<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
	<property name="interceptorNames">
        <value>transactionInterceptor</value>
	</property>
	<property name="beanNames">
		<list>
			<!-- Nome dos beans que terão o controle da transação -->
			<value>*Bo</value>
		</list>
	</property>
</bean>

<bean id="categoriaDao" class="com.digows.Savior.model.repository.hibernate.CategoriaHibernateDao">
	<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> 

<context:annotation-config/>
<context:property-placeholder location="jdbc.properties"/>

jdbc.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/struts2
jdbc.username=root
jdbc.password=root
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect


Introdução ao Spring 2.5
Transações
JPA

rpffoz

Ok!

mas a dúvida é como denoto para o Spring o meu Bean Dao com JDBC puro eu usaria estas annotations:

package com.digows.Savior.model.repository.jdbc;

import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import com.digows.Savior.model.repository.CategoriaRepository;
import com.digows.Savior.model.vo.CategoriaVO;

@Repository
public class CategoriaJDBCDao implements CategoriaRepository {
	
	private SimpleJdbcTemplate jdbcTemplate;
	
	@Autowired
	public void createTemplate(DataSource dataSource) {
		this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}
...

com o @Autowired o spring faria o setter do DataSource… mas e como faço isso extendendo de HibernateDaoSupport
para fazer o setter do sessionFactory?

rpffoz

Bom achei uma forma de resolver, ficou assim:

package com.digows.Savior.model.repository.hibernate;

import java.util.List;

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.digows.Savior.model.repository.CategoriaRepository;
import com.digows.Savior.model.vo.CategoriaVO;

@Repository
public class CategoriaHibernateDao extends HibernateDaoSupport implements
		CategoriaRepository {
	
	@Autowired
	public CategoriaHibernateDao(@Qualifier("sessionFactory")SessionFactory factory) {
		setSessionFactory(factory);
	}

	public CategoriaVO save(CategoriaVO p_categoria) {
		getHibernateTemplate().saveOrUpdate(p_categoria);
		return p_categoria;// ID Populada
	}

....

Alguém é contra usar desta forma no constructor do DAO?

antoniopopete

rpffoz, você conseguiu resolver essa arquitetura?

Criado 7 de janeiro de 2008
Ultima resposta 17 de mai. de 2008
Respostas 4
Participantes 3