2017-04-24 9 views
1

私はすべての子の関連付けなしで必要なオブジェクトを取得するのに問題があります。
私は私のクラスのサイトを持っている
遅延ロードが機能しません - すべての関連ではなく、親オブジェクトのみが必要

 

    @Entity 
    @Table(name = "Sites") 
    public class Site { 


    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Id_Site", unique = true, nullable = false) 
    private long Id_Site; 
    private String ...; 
    private boolean ...; 
    private long ...; 
    private Date ...; 
    private Date ...; 
    private String ...; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private Set sequences = new HashSet(); 

    @ManyToOne 
    private ... ...; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    private Set ... = new HashSet(); 

    @ManyToOne 
    private ... ...; 

    public constructor... 

    public set.. 
    public get.. 

ので、私は私が

 



    @Entity 
    @Table(name = "Sequences") 
    public class Sequence { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Id_Sequence", unique = true, nullable = false) 
    private long Id_Sequence; 
    private Date ....; 
    private Date ....; 
    private String ....; 
    private String ....; 
    private String ....; 
    private int ....; 
    private int ....; 
    private double ....; 
    private double ....; 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    private Set traceSequences = new HashSet(); 
    @ManyToOne(cascade = CascadeType.ALL) 
    private Site site; 

    public constructor... 

    public set.. 
    public get.. 


を持っている私のシーケンステーブルに
協会
シーケンスなしでサイトオブジェクトを必要とします私はこのエラーを取得

 

    @Override 
     public Site findSiteByName(String Name_Site) { 
      List sites = entityManager.createQuery("SELECT s FROM Site s").getResultList(); 
      for (Site item : sites) { 
       if (item.getNom_Site().equals(Name_Site)) { 
        return item; 
       } 
      } 

      return null; 
     }

:0私は、FetchType.Lazyを使用して、私のメソッドを呼び出すときxxx.xxx.xxx:

を遅延役割のコレクションを初期化に失敗しました。 xxx.xxx.site.Site.sequencesは、プロキシ初期化できませんでした - 私はFetchType.EAGERを使用する場合

はそして、私がサイトオブジェクトを取得していないセッションを、しかし、私はまた、すべてのシーケンス・オブジェクト、およびその他の団体のすべてのオブジェクトを取得します(それは私が知っているのは正常です)

、いくつかのいずれかは、JPA、セッションが閉じられた後にデータを取得しようとすると、これらの怠惰なエラーが発生した

+0

役に立つかもしれません。レイジーローディング**は**動作しています:そのため、エラーが発生します。それ以降のコードでは、遅延結合(JSONシリアライザなど)にアクセスしようとしていますが、セッションがないためロードできません。 –

答えて

2

を怠惰な注釈が動作しない理由を知って、そしてどのようにこの問題を解決してください。

しかし、eagerを使用すると、そのエンティティを含むすべてのクエリに影響します。

eagerの代わりにqueryでjoin fetchを使用してみてください。

+0

はい私はあなたに同意します。 しかし、Eagerに代わってクエリのjoin fetchがすべてのクエリに影響を与えます。Eagerだけを使用するのと同じです。 – Adams

0

コード内のどこかで、Site.GetSequences()と表示されている可能性があります。ビュー内またはコードの別の部分で繰り返している可能性があります。あなたが与えたコードが例外を生成しているようには見えません。

エンティティにロードされていないコレクションを使用しようとすると、コードはあなたが言及した例外をスローします。

これを解決するには、sequencesを使用している場所を特定し、EAGERにフェッチ変更またはがあなたのクエリでをFETCH JOINを使って、使用する前にそれらをロードします。

+0

ありがとう、私はそれを呼び出すことができるすべてのGetSequencesをコメントします。 しかし、私の質問です:私は結合フェッチを使用する場合、すべてのシーケンス要素を取得します(eagerを使用するのと同じです)、シーケンスを取得する必要はありません。 すべての依存関係を取得せずにサイトオブジェクトが必要です。 – Adams

0

返される内容とセッションが利用可能になったときにhibernateによって生成された内容に非常に慎重でない限り、Hibernate管理対象エンティティ(またはHibernate管理対象エンティティのコレクション)を返す可能性が最も高くなります。

私は、DTO(またはDTOのコレクション)を作成し、そのフィールドを好きなように作成すると言います。 Entity to DTO変換フレームワークはたくさんあります。私のfavはModelMapperです。

また、FetchTypeを使用して再生する他の提案にも同意する傾向がありますが、DTOにはアノテーションに基づいて休止状態が設定されたエンティティリレーションシップとは対照的に、

DTOで何かが必要な場合は、エンティティに尋ねるだけで、その時点でセッションが利用可能になるため、UIで必要と思われるフィールドを入力できます。

私はDTOとエンティティに対してこのトピックをハイジャックしたくありませんが、それは私がやる方法です。

これは、あなたが誤解されすぎAvoid Jackson serialization on non fetched lazy objects

関連する問題