Frage

Ich versuche mein Projekt mit Spring 3.1 und Hibernate zu errichten. 4. Ich habe einige Tutorials online verfolgt. Ich bekomme einen seltsamen Fehler, der nach den Federforen mit Frühjahr 3.1 behoben werden sollen. Spring Bug Tracker

Wenn mein Dienst anruft getCurrentSession(), Es macht die folgende Ausnahme:

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)

**** Bearbeiten: Aktualisierte meine Spring-dao.xml gemäß dem Frühjahr Feder 3.1 Dokumentation für Transaktionen. Ich habe versucht, meine DataSource mit a org.apache.commons.dbcp.basicdatasource auszutauschen. Gibt es Eigenschaften, die ich in meiner Konfiguration fehlt, die dies verursachen könnten? ****

Hier ist mein Spring-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" />

Meine Benutzerbean (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();
}
}

Und schließlich mein 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();
}
}

Mir ist klar, dass meine Datenquelle wahrscheinlich nicht gebraucht wird. Wenn ich vergessen habe, Konfigurationen einzuschließen, kann ich diesen Beitrag aktualisieren. Auch wenn die Tomcat -Startprotokolle benötigt werden, kann ich sie auch zur Verfügung stellen.

War es hilfreich?

Lösung

Ich hatte dieses Problem mit Spring-4.0.6 und Hibernate-4.3.6.

Lösung besteht darin, alle Annotations-, Komponenten-scan-, Annotationsantriebsantriebsanträge von root-context.xml auf servlet-context.xml zu verschieben:

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

DataSource, SessionFactory und TransactionManager können weiterhin unter root-context.xml definiert werden.

Andere Tipps

Ich habe das gleiche Problem in einer Webanwendung. Das Problem besteht darin, dass in beiden Konfigurationsdateien: application-context.xml und webmvc-context.xml vorhanden sind. Die webmvc-context.xml wird nach der Anwendung context.xml geladen. Ich denke, die DAO-Klasse wird zuerst mit Transaktionsreferenzen geladen, wenn die Anwendungskontext.xml geladen wird, aber sie durch ein anderes Objekt ohne Transaktionsreferenzen ersetzt wird, wenn webmvc-context.xml geladen wird. Wie auch immer, ich löste das Problem mit spezifischen Paketen, die gescannt wurden:
<context:component-scan base-package="com.app.repository" />
für Anwendungs-context.xml und
<context:component-scan base-package="com.app.web" />
für webmvc-context.xml.

Ist es eine Webanwendung? Wenn ja, sollten Sie OpenSessionInviewFilter verwenden. Denn ich glaube, dass es einen Punkt in dem Code geben muss, der die Sitzung aus dem Thread enträtselt, wenn ich den CocrentSession (der an aktuelles Thread gebunden ist).

Ich bin mir nicht sicher, ob Transaktionsleiter dies tut oder nicht.

Ich hatte den gleichen Fehler wie deins.

Dies ist ein Fehler, der noch nicht gelöst wird.

https://jira.springource.org/browse/spr-9028

Versuchen Sie, Hibernate -JAR -Dateien in 3.6 zu ändern. Weil der Frühling es benutzt.

http://mvnrepository.com/artifact/org.springframework/spring-orm/3.1.0.Release

Hier Frühling 3.1 Artefakt und Abhängigkeiten

Wie angegeben in Frühlingsreferenz (3.2.x):

Im Web -MVC -Framework verfügt jeder DispatcherServlet über einen eigenen WebApplicationContext, der alle bereits im Root WebApplicationContext definierten Bohnen erbt. Diese ererbten Bohnen können im servletspezifischen Bereich überschrieben werden, und Sie können neue Bereichespezifische Bohnen lokal in einer bestimmten Servlet-Instanz definieren.

So definierte oder gescannte Bohnen mit <context:component-scan> wird in Ihren Controllern sichtbar sein, damit Sie sie @autowired können, aber in anderen ApplicationContext* -Dateien nicht sichtbar sind. <tx:annotation-driven/> wurde in der Konfiguration von DispatherServlet nicht definiert, @Transactional Wird nicht funktionieren.

Ich denke also, dass du wahrscheinlich eine hast <context:component-scan> in der Konfiguration Ihres DispatcherServlets und <tx:annotation-driven/> Deklaration in Ihrem applicationContext*.xml, also @Autowired Funktioniert gut, aber @Transactional ist nicht.

Ich hatte das gleiche Problem und testete alle beantworteten Lösungen. Valis Antwort war sehr hilfreich. Was für mich funktioniert hat, war, diese Bohnen von ApplicationContext.xml in webservlet.xml zu verschieben:

<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>

Außerdem müssen Sie webservlet.xml hinzufügen:

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
    "

Fügen Sie in Ihrem web.xml einen OpenSessionInviewfilter -Filter hinzu

<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>

Ich bin mir nicht sicher, aber das Problem könnte darin sein p:packagesToScan. Ihr KonfigurationSerservice befindet sich im Paket com.foo.lystra.services aber p:packagesToScan hat com.foo.lystra.beans

Ihre Konfiguration zeigt nicht auf die kommentierten Klassen. Füge sie hinzu

<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>

Das ist vergleichbar mit AnnotationsionSessionFactoryBean Welches war früher da. Überprüfen Sie die API hier .

Ich glaube du brauchst:

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

Andernfalls findet der Federkontext Ihren Dienst nicht und wickelt Ihre Methoden daher nicht mit den Transaktionsaspekten ein.

Hatte genau den gleichen Fehler und es wurde gelöst, indem nur ein erstellt wurde Schnittstelle für meinen Service. In Ihrem Fall würde ich also erstellen:

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

Wechseln Sie dann CongregationUserservice, um es umzusetzen:

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

und wo Sie CongregationSerService automatisiert haben, um stattdessen die ICongregationSerservice von AutoWire IcongregationSerservice:

@Autowired
private ICongregationUserService congregationUserService;

Ich habe dieses Problem gelöst, indem ich einsetzte <tx:annotation-driven transaction-manager="miTransactionManager"/> im Dispatcher-servlet.xml anstelle einer anderen XML-Konfigurationsdatei.

Ich denke, so erlaubt es Beans, im selben Frühlingskontext zu koexistieren.

Ich habe festgestellt, dass dieses Problem ein Fehler des Frühlings ist

dieser Link https://jira.springource.org/browse/spr-9020 meldet das Problem ..

Um es zu beheben, habe ich die Problemumgehung der Matias Mirabelli verwendet, die auf diesem Link zu finden ist https://gist.github.com/seykron/4770724

Was passiert, ist, dass Methoden mit Annotation mit Propagation.SUPPORTS Unterstützt die Transaktion, aber wenn keine Transaktionen an den Faden gebunden sind, anstatt eine neue Sitzung zu erstellen, wirft sie eine aus HibernateException

Um die Sollution zu konfigurieren, können Sie die Hibernate -Eigenschaft verwenden:

hibernate.current_session_context_class = com.your.package.TransactionAwareSessionContext

ich lege

<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 die root.xml.

Und ich stelle

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

int die servlet-context.xml.

Es klappt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top