Question

Je suis en train de mettre en place mon projet avec Spring 3.1 et Hibernate 4. J'ai suivi quelques tutoriels en ligne. Je reçois une erreur étrange que, selon les forums de printemps aurait été fixé avec le printemps 3.1. Spring Bug Tracker

Quand appelle mon service getCurrentSession(), il jette l'exception suivante:

org.hibernate.HibernateException: **No Session found for current thread**] with root cause org.hibernate.HibernateException: No Session found for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:881)

**** EDIT: mis à jour mon ressort dao.xml selon le printemps Spring 3.1 Documentation des transactions . Je l'ai essayé échanger mon source de données avec un org.apache.commons.dbcp.BasicDataSource. Y a-t-il des propriétés que je suis absent de ma configuration qui pourrait être la cause? ****

Voici mon ressort dao.xml:

 <!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />   

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <value>hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect</value>
    </property>
</bean>

<!-- Declare a datasource that has pooling capabilities-->   
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
            destroy-method="close"
            p:driverClass="${app.jdbc.driverClassName}"
            p:jdbcUrl="${app.jdbc.url}"
            p:user="${app.jdbc.username}"
            p:password="${app.jdbc.password}"
            p:acquireIncrement="5"
            p:idleConnectionTestPeriod="60"
            p:maxPoolSize="100"
            p:maxStatements="50"
            p:minPoolSize="10" />

<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" 
            p:sessionFactory-ref="sessionFactory" />

Mon grain de l'utilisateur (User.java)

package com.foo.lystra.beans;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="users")
public class User implements Serializable {
private static final long serialVersionUID = -5527566191402296042L;

@Id
@Column(name = "idusers")
private Integer user_id;

@Column(name="login_name")
private String loginName;

@Column(name="password")
private String password;

@Column(name="role")
private String role;

@Column(name="congregation_id")
private Integer congregation_id;

public Integer getUser_id() {
    return user_id;
}
public void setUser_id(Integer user_id) {
    this.user_id = user_id;
}
public String getLoginName() {
    return loginName;
}
public void setLoginName(String loginName) {
    this.loginName = loginName;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public String getRole() {
    return role;
}
public void setRole(String role) {
    this.role = role;
}
public Integer getCongregation_id() {
    return congregation_id;
}
public void setCongregation_id(Integer congregation_id) {
    this.congregation_id = congregation_id;
}

public String toString() {
    return "user_name: " + this.loginName + " congregation_id: " + this.congregation_id.toString();
}
}

Et enfin mon service ...

package com.foo.lystra.services;

import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.foo.lystra.beans.User;
import com.foo.lystra.beans.Congregation;

@Service("congregationUserService")
@Transactional
public class CongregationUserService {
protected static Log logger = LogFactory.getLog(CongregationUserService.class);

@Resource(name="sessionFactory")
private SessionFactory sessionFactory;

public List<User> getAllUsers() {
    logger.debug("getting all users");

            //Exception is thrown on this next line:
    Session session = sessionFactory.getCurrentSession();

    Query query = session.createQuery("FROM users");
    return query.list();
}
}

Je me rends compte que mon source de données est sans doute pas utilisé. Si j'ai oublié d'inclure toutes les configurations que je peux mettre à jour ce post. Aussi, si les journaux de Tomcat sont nécessaires, je peux leur fournir ainsi.

Était-ce utile?

La solution

J'ai eu ce problème avec le printemps-4.0.6 et hibernate-4.3.6.

La solution est de mettre tous les composants de balayage entraîné annotation, directives, entraîné annotation-de-root context.xml à servlet-context.xml:

<mvc:annotation-driven />
<context:component-scan base-package="ru.dd.demo" />
<tx:annotation-driven transaction-manager="transactionManager" />

dataSource, sessionFactory et transactionManager peuvent encore être définis à la racine-context.xml.

Autres conseils

J'ai le même problème dans une application Web. Le problème est avec qui existent dans les deux fichiers de configuration: application context.xml et webmvc-context.xml. Le webmvc-context.xml est chargé après application context.xml. Je pense que la classe DAO est chargé en premier avec des références de transaction lorsque le context.xml d'application est chargé, mais il est le remplacer par un autre objet, sans références de transaction, lorsque webmvc-context.xml est chargé. De toute façon, je résoudre le problème des packages spécifiques scannés:
<context:component-scan base-package="com.app.repository" />
pour application context.xml, et
<context:component-scan base-package="com.app.web" />
pour webmvc-context.xml.

Est-ce une application web? Si pensez à utiliser OpenSessionInViewFilter. Parce que je crois lors de l'utilisation currentSession (qui est lié à thread courant) il doit y avoir un point dans le code qui délie la session du fil.

Je ne suis pas sûr que gestionnaire de transactions fait cela ou non.

J'ai eu la même erreur que le vôtre.

Ceci est un bug qui n'est pas encore résolu.

https://jira.springsource.org/browse/SPR-9028

Essayez de modifier les fichiers de mise en veille prolongée jar à 3,6. parce que le printemps utilise.

http://mvnrepository.com/artifact/org. springframework / ressort-orm / 3.1.0.RELEASE

ici artefact Spring 3.1 et dépendances

Comme indiqué dans Spring Référence (3.2.x):

Dans le framework MVC Web, chaque DispatcherServlet a son propre WebApplicationContext, qui hérite de toutes les fèves déjà définies dans la racine WebApplicationContext. Ces haricots peuvent être hérités surchargées dans le cadre spécifique de-servlet, et vous pouvez définir de nouvelles les haricots portée spécifiques locales à une instance Servlet donné.

Les haricots définis ou scannées avec <context:component-scan> seront visibles dans vos contrôleurs afin que vous puissiez les @Autowired, mais ne sera pas visible dans d'autres applicationContext * fichiers, donc à moins <tx:annotation-driven/> n'a été pas défini dans la configuration de DispatcherServlet, @Transactional ne fonctionnera pas.

Je suis suppose que probablement vous avez un <context:component-scan> dans votre config de DispatcherServlet et la déclaration <tx:annotation-driven/> en vous applicationContext * .xml, donc @Autowired fonctionne très bien, mais @Transactional est pas.

J'ai eu le même problème et testé toutes les solutions répondues. La réponse de Vali a été très utile. Ce qui a fonctionné pour moi, se déplaçait ces fèves de applicationContext.xml en web-servlet.xml:

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>       
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <tx:annotation-driven />
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

, vous devez également ajouter en web-servlet.xml:

xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"

xsi:schemaLocation="       
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    "

Ajouter un filtre OpenSessionInViewFilter dans votre web.xml

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

Je ne sais pas, mais le problème pourrait être en p:packagesToScan. Votre ConfigurationUserService est en com.foo.lystra.services paquet mais p:packagesToScan a com.foo.lystra.beans

La configuration ne pointe pas vers les classes annotées. Ajoutez-

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
  <property name="hibernateProperties">
     <value>hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect</value>
  </property>

  <property name="annotatedClasses">
    <list>
      <value>test.package.Foo</value>
      <value>test.package.Bar</value>
    </list>
  </property>
</bean>

Il est similaire à ici .

Je crois que vous avez besoin:

<context:component-scan base-package="com.foo.package" />

Sinon, le contexte du printemps ne trouvera pas votre service, ne sera donc pas envelopper vos méthodes avec les aspects transactionnelles.

avait exactement la même erreur et il a été résolu par la simple création d'un Interface pour mon service. Donc, dans votre cas, je créerais:

public interface ICongregationUserService {
   public List<User> getAllUsers();
}

puis modifiez CongregationUserService pour la mettre en œuvre:

@Service("congregationUserService")
@Transactional
public class CongregationUserService implements ICongregationUserService{
   //...
}

et où vous autowired CongregationUserService, autowire ICongregationUserService à la place:

@Autowired
private ICongregationUserService congregationUserService;

Je résolu ce problème en mettant <tx:annotation-driven transaction-manager="miTransactionManager"/> dans le répartiteur-servlet.xml au lieu de tout autre fichier de configuration XML.

Je pense que cette façon permet de haricots de coexister dans un même contexte de printemps.

J'ai trouvé que cette question est un bug du printemps

ce lien https://jira.springsource.org/browse/SPR-9020 rapporte le problème ..

pour le fixer, je l'ai utilisé la solution de Matias Mirabelli qui se trouve sur ce lien https: // gist.github.com/seykron/4770724

ce qui se passe est que les méthodes annotées avec transaction de supports de Propagation.SUPPORTS mais s'il n'y a pas de transactions liées au fil du ressort au lieu de créer une nouvelle session, il jette un HibernateException

afin de configurer la sollution vous pouvez utiliser la propriété de mise en veille prolongée:

hibernate.current_session_context_class = com.your.package.TransactionAwareSessionContext

Je mis

<context:component-scan base-package="com.sprhib.repo"/>  #(some class files are annotaed by @Repository,@Service,@Component)
<tx:annotation-driven transaction-manager="txManager" />
<task:annotation-driven/>

int root.xml.

Et je mets

<context:component-scan base-package="com.sprhib.web"/>  #(some class files are annotaed by @Controller)
<mvc:annotation-driven />

int servlet-context.xml.

Il fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top