2012-07-03 3 views
0

У меня возникли проблемы с открытием транзакции в спящем режиме.Получить недействительно без активных транзакций

Это конфигурация:

<context:annotation-config /> 
    <context:component-scan base-package="com.cinebot" /> 
    <mvc:annotation-driven /> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.cinebot.db.entity</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

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

<tx:annotation-driven /> 

И это ошибочный код:

@Transactional 
public static <T> T get(Class<T> classe, Serializable id) throws Exception { 
    if(id==null) return null; 
    T obj = (T) HibernateUtil.getSessionFactory().getCurrentSession().get(classe, id); 
    return obj; 
} 

Это исключение:

org.hibernate.HibernateException: get is not valid without active transaction 

Это пример entitiy:

package com.cinebot.db.entity; 

// Generated 3-lug-2012 10.31.04 by Hibernate Tools 3.4.0.CR1 

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

/** 
* Dettagli generated by hbm2java 
*/ 
@Entity 
@Table(name = "dettagli", catalog = "cinebot") 
public class Dettagli implements java.io.Serializable { 

    private static final long serialVersionUID = 1L; 
    private String nome; 
    private String valore; 

    public Dettagli() { 
    } 

    public Dettagli(String nome) { 
     this.nome = nome; 
    } 

    public Dettagli(String nome, String valore) { 
     this.nome = nome; 
     this.valore = valore; 
    } 

    @Id 
    @Column(name = "nome", unique = true, nullable = false, length = 32) 
    public String getNome() { 
     return this.nome; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    @Column(name = "valore", length = 65535) 
    public String getValore() { 
     return this.valore; 
    } 

    public void setValore(String valore) { 
     this.valore = valore; 
    } 

} 

Я не могу понять, почему не хватает аннотации @Transactional для автоматического открытия транзакции. Что я пропустил?

Благодаря

+0

Похоже, вы используете транзакционную аннотацию в классе DAO. Можете ли вы показать определение/аннотацию весеннего компонента для вас dao, а также как вы сканируете пакеты? –

+0

Я использую один класс Dao, метод @Transactional является частью этого Dao. Я думаю, что транзакция плохо настроена ... но я не могу найти, где. – Tobia

+0

Обычно транзакцию необходимо аннотировать в классе обслуживания. Используете ли вы класс обслуживания? [Лучшие практики] (http://stackoverflow.com/questions/1079114/spring-transactional-annotation-best-practice) –

ответ

1

На основе комментариев Вы можете еще раз проверьте ниже пунктов (хотя я бы не рекомендовал использовать тот же)

  • Вам нужно вводить/autowire пружинный DAO в контроллер. Аннотировать DAO с помощью @Repository
  • Убедитесь, что ваша пружина сканирует и создает компонент для вашего класса DAO, который выполняется по контексту: компонентное сканирование. Здесь ваш класс dao должен находиться внутри данного пакета/подпакета.

Я бы рекомендовал использовать сервисный слой между вашим контроллером и DAO. Аннотировать метод службы как @transactional, который вызывает метод в DAO. Помните, что вы не должны создавать новый экземпляр какого-либо компонента, чтобы вызывать методы в нем, но вставлять/autowire Service-> Controller и DAO-> Service.

+0

Я использовал HibernateUtil.getSessionFactory(). GetCurrentSession(); вместо autowiring sessionfactory .... извините – Tobia

+1

Умм, как это правильный ответ? Это не имеет никакого отношения к вашему вопросу. –

1

Просто поглядев на этот код, он явно не будет работать с пружинными транзакционных аннотациями.

Вы используете статический метод и получаете свой SessionFactory от статического держателя.

Вам нужно получить экземпляр вашего DAO из Spring, который подключен к экземпляру SpringFactory Session Spring. Это позволит Spring проксировать DAO и обеспечивать транзакционное поведение.

+0

Убрана поддержка, но транзакция по-прежнему не открывается автоматически. – Tobia

+0

Да: org.hibernate.HibernateException: get недействителен без активных транзакций \t at org.hibernate.context.internal.ThreadLocalSessionContext $ TransactionProtectionWrapper.invoke (ThreadLocalSessionContext.java: 348) – Tobia

+0

Я использовал HibernateUtil.getSessionFactory(). getCurrentSession(); вместо autowiring sessionfactory .... извините – Tobia

Смежные вопросы