1

Hibernate 4.1 と Spring 3.1 と JSF 1.2 (myFaces) を使用する webapp があります。

ページにアクセスしようとするたびに、この「LazyInitializationException」が発生します

Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at £org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:149)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:195)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at foo.data.bo.implementations.EOServiceType_$$_javassist_10.getTechKey(EOServiceType_$$_javassist_10.java)
at foo.converter.EOServiceTypeConverter.getAsString(EOServiceTypeConverter.java:36)
at org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:648)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils.getSubmittedOrSelectedValuesAsSet(HtmlRendererUtils.java:362)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:337)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRendererUtils.renderMenu(HtmlRendererUtils.java:288)
at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:57)
at org.apache.myfaces.renderkit.html.ext.HtmlMenuRenderer.encodeEnd(HtmlMenuRenderer.java:70)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:649)
... 50 more

クラスに「セッション」を与える方法がわからないため、何かを誤解していると思います。

情報については、ここに私の構成ファイルのいくつかがあります:

春の config.xml:

<context:annotation-config />
<context:component-scan base-package="foo" />

<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="namingStrategy">
        <ref bean="oracleNamingStrategy" />
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

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

<alias name="jndiDataSource" alias="dataSource" />

<bean name="oracleNamingStrategy"
      class="org.hibernate.cfg.ImprovedNamingStrategy">
</bean>

<bean name="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName">
        <value>java:comp/env/jdbc/fooDS</value>
    </property>
</bean> 

私のJavaクラスEOServiceType

@Entity
@Table(name="EOSERVICETYPE")
public class EOServiceType implements IEOServiceType {

@Id
@Column(name="EOSERVICETYPE_ID")
private long techKey; 

@Column(name="H_PROPERTY")
private String property;

@Column(name="H_DESCRIPTION")
private String description;

//... + all getters and setters
}

Hibernate EOServiceTypeDaoHibernateImpl の私の DAO 実装

@Repository("eOServiceTypeDao")
public class EOServiceTypeDaoHibernateImpl implements IEOServiceTypeDao {

@Autowired
private SessionFactory sessionFactory;

    public void save(IEOServiceType serviceType) {
    sessionFactory.getCurrentSession().save(serviceType);
}

public void update(IEOServiceType serviceType) {
    sessionFactory.getCurrentSession().update(serviceType);
}

    //... and some other CRUD operations...
}

Hibernate EOWebStaffServicesImpl の POJO サービスの実装

@Service
public class EOWebStaffServicesImpl implements IEOWebStaffServices {

@Autowired
private SessionFactory sessionFactory;

//...

@Autowired
private IEOServiceTypeDao eoServiceTypeDao;

    public void saveOrUpdateEOServiceType(IEOServiceType eoServiceType) {
    try {
        eoServiceTypeDao.saveOrUpdate(eoServiceType);
    } catch (DataIntegrityViolationException e) {
        DuplicateKeyException exception= new DuplicateKeyException("Duplicate business key for " + eoServiceType,e);
        throw exception;
    }
}
    public void deleteEOServiceType(IEOServiceType eoServiceType) {
    eoServiceTypeDao.delete(eoServiceType);
}

私のHibernate Configファイル:

<hibernate-configuration>
<session-factory>
    <property name="hibernate.mapping.precedence">hbm, class</property>    
<property name="show_sql">false</property>
<property name="format_sql">true</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="jdbc.batch_size">20</property>

    <mapping class="foo.data.bo.implementations.EOServiceType"/>
    <!-- ... and other mappings -->
</session-factory>
</hibernate-configuration>

私を助けるためのヒントを持っている体はありますか?いくつかの記事を読んで投稿しましたが、問題の解決策が実際には見つかりませんでした。

よろしくお願いします、

カムラン

4

3 に答える 3

1

私は数週間前に同じ種類の問題を抱えていました。Hibernateとやり取りしているメソッドに注釈を付けるのを明らかに忘れていました。

をお勧めします

@Transactional

注釈。それはあなたの問題を解決するはずです。

それ以外の場合は、関連するHibernateドキュメント: Sessions and Transactionsがあります。

于 2012-07-11T07:44:46.953 に答える
0

これは、DAOクラスでトランザクションを使用しないために発生すると思います。Hibernateは、トランザクション以外ではSpringと連携しません。Springを使用して宣言型トランザクションを定義できます(必要なクラスに@Transactionalアノテーションを付けます)。トランザクションに関するSpringリファレンスドキュメントへのリンクは次のとおりです。

また、使用する前にSessionFactoryをBeanに注入する必要があります。

@autowired
private SessionFactory sessionFactory;
于 2012-07-11T07:39:44.213 に答える
0

SessionFactoryサービス クラスで を使用して何をアーカイブする予定ですか?

とにかく、遅延プロパティを持つ切り離されたオブジェクトにアクセスしようとしていることが問題だと思います。(通常、その例外が表示される場合があります)

POJO のコードはこれだけですか?

于 2012-07-11T09:05:55.717 に答える