Hibernate SessionFactory vs Printemps LocalSessionFactoryBean
Je suis en train de déplacer un spring3.2.x + hibernate4.x le programme d'installation à partir d'un xml pour java configuration.
Voici un extrait du code existant:
import org.hibernate.SessionFactory;
import org.hibernate.Query;
import org.hibernate.Session;
public class StockDaoImpl implements StockDao{
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void save(Stock stock){
Session session = getSessionFactory().openSession();
try{
session.save(stock);
}
finally{
session.close();
}
}
Le printemps de fichier de config
<!-- Stock Data Access Object -->
<bean id="stockDao" class="com.data.dao.StockDaoImpl" >
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="dataSource">
.....
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
......
</property>
<property name="mappingResources">
.......
</property>
</bean>
Cela fonctionne très bien - mais comment puis-je re-définir cette config en java?
Heres une tentative -
@Bean
public StockDao stockDao() {
StockDaoImpl dao=new StockDaoImpl();
dao.setSessionFactory(sessionFactory());
return dao;
}
......
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(new String[] { .....});
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
Mais cette habitude de compiler le sessionFacotry être visé n'est pas du ressort LocalSessionFactoryBean?
Comment concilier cela?
Ce ne compile pas: ce qui est l'exacte et complète d'erreur de compilation? Pourquoi n'utilisez-vous pas permettra à l'autowiring et classpath de numérisation au lieu de définir votre DAO explicitement?
com\data\config\PersistenceConfig.java:32: setSessionFactory(org.mise en veille prolongée.Sessi onFactory) dans com.les données.dao.StockDaoImpl ne peut pas être appliqué à (org.springframewor k.orm.hibernate4.LocalSessionFactoryBean) dao.setSessionFactory(sessionFactory());
com\data\config\PersistenceConfig.java:32: setSessionFactory(org.mise en veille prolongée.Sessi onFactory) dans com.les données.dao.StockDaoImpl ne peut pas être appliqué à (org.springframewor k.orm.hibernate4.LocalSessionFactoryBean) dao.setSessionFactory(sessionFactory());
OriginalL'auteur IUnknown | 2013-08-02
Vous devez vous connecter pour publier un commentaire.
LocalSessionFactoryBean est un
FactoryBean<SessionFactory>
. Cela signifie qu'il permet de créer des instances de SessionFactory.Vous avez juste besoin
Mais je ne voudrais pas créer des DAOs explicitel comme ça. Simplement d'annoter vos DAO avec @Référentiel, et autowire la fabrique de session à l'aide de @Autocâblés. Assurez-vous que le Java config classe est annotée avec
@ComponentScan("the.base.package.of.daos")
OriginalL'auteur JB Nizet
Manquant getObject() appel en retour.
Substituite avec
return sessionFactory.getObject()
(et de changer le type de retour,trop!)OriginalL'auteur Luca Basso Ricci