获取也不是没有积极的交易有效(Get is not valid without active tra

2019-09-19 00:58发布

我有一个无法打开的Hibernate事务。

这是配置:

    <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注解为自动打开事务。 我错过了什么?

谢谢

Answer 1:

根据该意见,您可以重新检查以下点(虽然我不建议使用相同)

  • 你需要注入/自动装配弹簧DAO到控制器中。 注释与@Repository的DAO
  • 确保你的春天扫描和用于由上下文做你的DAO类创建豆:组件扫描。 在这里你的DAO类应该是给定的包/子包内。

我会推荐给你的控制器和DAO之间使用的服务层。 注释为@Transactional服务方法,在DAO调用方法。 记住,你不应该为了调用它的方法,但注入/自动装配服务 - >控制器和DAO->服务创建任何bean的新实例。



Answer 2:

只要有一看这段代码,它显然不打算使用Spring的事务注释工作。

您正在使用一个静态方法和静态持有人获得SessionFactory的。

您需要获得您的DAO从春季的一个实例是有线与SessionFactory的春季实例。 这将允许Spring来代理的DAO,并提供交易行为。



文章来源: Get is not valid without active transaction