0

Hiberante と Spring に問題があります。

エンティティを取得するとすべてが機能しますが、サブプロパティを使用すると、セッションが閉じているために遅延ロードが失敗します...なぜそんなに早くセッションを閉じるのですか? サービスを終了するか、スレッドごとに 1 つのセッションを取得するのが待ちきれませんか?

これが私の構成です

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

これは私のダオです:

@Transactional
public class Dao {


    @Autowired
    private SessionFactory sessionFactory;

    public Session getSession(){
        return sessionFactory.getCurrentSession();
    }

    @SuppressWarnings("unchecked")
    public <T> T get(Class<T> classe, Serializable id) throws Exception {
        if(id==null) return null;
        T obj = (T) getSession().get(classe, id);
        return obj;
    }

}

そして、これは@Serviceクラス内でエラーが発生する場所です(getEventi()は遅延ロードされます):

    Spettacoli spettacolo = dao.get(Spettacoli.class, spettacoloId);
   if(spettacolo.getEventi().getScadenza()>0) throw new LogicalException("Spettacolo scaduto");
4

1 に答える 1

1

トランザクション外のエンティティにアクセスしています。サービス メソッドをトランザクションとしてマークする必要があります。

現在のコードでは、dao メソッドが完了するとトランザクションが終了するため、サービス メソッドでそのエンティティにアクセスすると、確実に例外をスローする切り離されたエンティティになります。

子エンティティへのアクセスを許可する DAO ではなく、サービス内でトランザクションを開始する必要があることに注意してください。@transactional アノテーションをサービス メソッドに移動します。

于 2012-07-04T13:22:06.747 に答える