0

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

これは実体の例です:

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 アノテーションがトランザクションを自動オープンするのに十分でない理由がわかりません。私が逃したものは何ですか?

ありがとう

4

2 に答える 2

1

このコードを見ただけでは、Spring のトランザクション アノテーションでは機能しないことは明らかです。

静的メソッドを使用しており、静的ホルダーから SessionFactory を取得しています。

SessionFactory の Spring インスタンスと接続されている Spring から DAO のインスタンスを取得する必要があります。これにより、Spring は DAO をプロキシし、トランザクション動作を提供できます。

于 2012-07-03T13:37:35.313 に答える
1

コメントに基づいて、以下の点を再確認できます(ただし、同じ使用はお勧めしません)

  • コントローラーにスプリングDAOを注入/自動配線する必要があります。@Repository で DAO に注釈を付ける
  • スプリングがスキャンし、context:component-scan によって行われる DAO クラスの Bean を作成することを確認してください。ここで、dao クラスは、指定されたパッケージ/サブパッケージ内にある必要があります。

Controller と DAO の間でサービス層を使用することをお勧めします。DAO でメソッドを呼び出す @transactional としてサービス メソッドに注釈を付けます。メソッドを呼び出すために Bean の新しいインスタンスを作成するのではなく、Service->Controller および DAO->Service を注入/自動配線する必要があることに注意してください。

于 2012-07-03T14:14:41.240 に答える