2011-11-14 2 views
4

Comment créer une SessionFactory à l'aide de la configuration java? Cela ne marche pas pour une raison quelconque ... il renvoie toujours la valeur null.Spring Hibernate SessionFactory

Répondre

3

À noter ici que Spring 3.1 introduit LocalSessionFactoryBuilder, qui est expressément conçu pour être utilisé dans les méthodes @Bean.

http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html

Ce contourne la nécessité difficile à traiter FactoryBeans, les méthodes getObject(), etc. FactoryBeans sont excellents pour une utilisation en XML, mais non idéal dans les méthodes @Bean. Notez que ce nouveau générateur est uniquement Hibernate 4.1+.

10

à la place usine de retour:

@Bean 
public AbstractSessionFactoryBean sessionFactoryBean(){ 
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean(); 
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); 
    return sessionFactoryBean; 
} 

Si vous avez besoin d'injecter SessionFactory directement quelque part dans le code, ajoutez cette méthode d'assistance:

public SessionFactory sessionFactory() { 
    return sessionFactoryBean().getObject(); 
} 

Notez que l'aide sessionFactory() est pas annotée avec @Bean - C'est vraiment important.

+0

Cela a fonctionné pour moi mais j'étais confus où le haricot devait être placé. Pour les autres, si vous avez une classe qui contient une annotation avec '@Configuration', je mettrais la méthode '@Bean' dedans. Chargé aucun problème et j'étais prêt à partir. –

+0

AbstractSessionFactoryBean est obsolète – Blauhirn

5

Tomasz est juste, mais je ne crois que la création d'instance d'objet à l'aide « nouvelle » n'a pas les pieds avec le concept de printemps:

Je pense que vous devez le faire de cette façon:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="hibernateProperties"> 
<props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <prop key="hibernate.hbm2ddl.auto">update</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    </props> 
    </property> 
     <property name="annotatedClasses"> 
     <list> 
     <value>com.vanilla.objects.Student</value> 
     <value>com.vanilla.objects.Address</value> 

     </list> 
    </property> 
    </bean> 

<bean id="transactionManager" 
      class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 

puis vous pouvez l'utiliser dans votre grain de printemps:

@Autowired 
    SessionFactory sessionFactory; 

puis à l'intérieur de votre méthode:

Session session = sessionFactory.getCurrentSession(); 
+2

Il utilise [configuration de conteneur basée sur Java] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java) , qui est la nouvelle fonctionnalité de Spring 3.0.x. Le code d'OP est complètement fin et idiomatique (sauf le problème auquel il fait face, bien sûr). –

2

Vous devez appeler afterPropertiesSet() sur l'usine de la session après avoir réglé toutes les propriétés

Donc, dans votre exemple, il ressemblerait à ceci:

@Bean 
public SessionFactory sessionFactory(){ 
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean(); 
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml")); 
    sessionFactoryBean.afterPropertiesSet(); 
    return sessionFactoryBean.getObject(); 
} 
0

Étant donné que les réponses ci-dessus sont pas à jour, voici un plus moderne approche:

@Bean 
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf){ 
    return hemf.getSessionFactory(); 
} 

En outre, si vous avez un EntityManager injecté, vous pouvez obtenir la session en cours via

Session session = entityManager.unwrap(Session.class); 
Questions connexes