0

私はHibernate3.5.1-Finalを使用しており、 Spring 3.0.5.RELEASEを使用しており、 OpenSessionInViewFilter に次の構成を使用しています。

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
      <param-name>sessionFactoryBeanName</param-name>
      <param-value>sessionFactory</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>ERROR</dispatcher>
  </filter-mapping>

私が次のエンティティを持っていると仮定します:

@SuppressWarnings("serial")
@Entity
@Table(name = "adpage", catalog = "mydb")
public class Adpage implements java.io.Serializable {

    @Id
    @Column(name = "pkid", nullable = false, length = 50)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(fetch = FetchType.EAGER)
    private long pageId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "audio_file_id", unique = true, nullable = true)
    private AudioFile audioFile ;

}

私のバッキングBeanは次のとおりです。

@Component("myBean")
@Scope("view")
public class MyBean {

    @Autowired
    private AdPageDao adPageDao;

    @Autowired
    private AdPageService adPageService;

     public void preRender() {
                adPageObj = adPageDao.getAdPageByID(adPageId);
    }

    public void deleteAdPage(Adpage adPage) {
        adPageService.deleteAdPage(adPage);
    }



}

私のサービスは次のとおりです。

@Service
public class AdPageService {

    @Autowired
    private AudioFileDao audioFileDao;

    public void deleteAdPage(Adpage adPage) {


        if (adPage.getAudioFile() != null) {
            log.debug("deleting audio file: "
                    + adPage.getAudioFile().getName() + " for adpage: " // exception here
                    + adPage.getName());
            audioFileDao.deleteAudioFile(adPage.getAudiofileref());
            GeneralUtils.deleteFilePhysically(adPage.getAudioFile()
                    .getName();
        }

    }


}

私のxhtmlページは次のとおりです。

<f:event type="preRenderView" listener="#{myBean.preRender}" />
<ice:panelGrid columns="2">

                 <ice:outputLabel id="fileName">File Name:</ice:outputLabel>
                 <ice:outputText value="#{myBean.adPageObj.audioFile.originalName}"></ice:outputText>

                 <ice:outputLabel id="fileLength">File Length:</ice:outputLabel>
                 <ice:outputText value="#{myBean.adPageObj.audioFile.length}"></ice:outputText>

                 <ice:outputLabel id="fileDesc">Description:</ice:outputLabel>
                 <ice:outputText value="#{myBean.adPageObj.audioFile.description}"></ice:outputText>

               </ice:panelGrid>

xhtmlページでは、遅延読み込みは問題なく機能し、ファイルデータは正しく表示されますが、ファイルを削除すると、サービスの削除メソッドで次のエラーが発生します。AdPageService.deleteAdPage

Could not initialize proxy - no Session

このエラーを修正する方法を教えてください。

4

1 に答える 1

2

オブジェクトがビューにロードされた場合AdPage(以前のHibernateセッションのためOpenSessionInViewFilter)、エンティティが「デタッチ」されているため、遅延ロードは機能しません。

遅延読み込みの問題を解決するには、次のようにします。

  1. エンティティを現在のHibernateセッションに再接続します
  2. すべての属性がロードされていることを確認するために、前に熱心なフェッチを実行してください
  3. IDでエンティティをリロードします(pageIdここ)

オプション3(IDでリロード)を選択して、新しいエンティティ(フォームの表示/送信中に変更された可能性があります)を取得します。

于 2012-07-05T15:08:17.467 に答える