2017-10-23 7 views
3

私は@OneToManyの関係をFabricRollFabricDefectの間に持っています。Spring Data、JPA @OneToMany Springブートで動作しない遅延読み込み

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn(name = "fabric_roll_id", referencedColumnName = "fabric_roll_id") 
private Set<FabricDefect> fabricDefects = new HashSet<>(); 

問題は、私はFabricRollJpaRepositoryによって機能を得る

でのfindAll()

FabricDefectもロードされます。

私はgetFabricDefect()

FabricRollServiceImplクラス

@Component 
public class FabricRollServiceImpl implements IFabricRollService{ 
    @Autowired 
    FabricRollRepository fabricRollRepository; 

    @Transactional(propagation = Propagation.REQUIRED) 
    @Override 
    public List<FabricRoll> getAllFabricRoll() { 
     FabricRoll fabricRoll1 = new FabricRoll(); 
     fabricRoll1.setBatchNo("34344"); 
     fabricRoll1.setLotNo("425"); 
     fabricRoll1.setPoNo("42"); 
     fabricRoll1.setRollLength(2343); 
     fabricRoll1.setRollNo("356"); 
     fabricRoll1.setRollWidth(60); 
     fabricRoll1.setStyleNo("354"); 

     FabricDefect fabricDefect = new FabricDefect(); 
     fabricDefect.setDefectNote("note"); 
     fabricDefect.setDefectPoint(3); 
     fabricDefect.setSegment(3); 
     fabricDefect.setYard(42); 


     Set<FabricDefect> fabricDefects = new HashSet<>(); 
     fabricDefects.add(fabricDefect); 


     fabricRoll1.setFabricDefects(fabricDefects); 

     addFabricRoll(fabricRoll1); 

     FabricRoll fabricRoll = null; 


     return fabricRollRepository.findAll(); 
    } 

@Override 
public void addFabricRoll(FabricRoll fabricRoll) { 
    fabricRollRepository.save(fabricRoll); 
} 

}

ブレークポイント関数を呼び出すときにのみFabricRollFabricDefectがロードするロードしたい: enter image description here

コンソールには: enter image description here

+0

これはOneToManyです。理由はJoinColumnですか? –

+0

'FabricDefect'クラスにあるものを表示します。 – Manza

+0

' @ Transactional'アノテーションを取り除くと 'LazyInitializationException'が返され、コレクションがロードされていないことがわかります。 – Manza

答えて

0

あなたは@JoinColumnを使用する必要はありません、あなたは

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
private Set<FabricDefect> fabricDefects ; 

this問題の詳細情報fabricDefectsをインスタンス化する必要はありません。

+0

これは機能していません。すべてのFabricDefectを読み込みます –

0

FabricDefectクラス:

@ManyToOne 
@JoinColumn(name = "fabric_roll_id") 
private FabricRoll roll; 

FabricRollクラス:

@OneToMany(mappedBy = "roll") 
private Set<FabricDefect> fabricDefects; 

コレクションは、デフォルトでは遅延ロードされ、JPAは、メソッドgetFabricDefectsが呼び出されるだけデシベルを照会します。 ロギングを有効にすることでそれを見ることができます。

0

私はthis tutorialで解決策を見つけました。

あなたは以下のようにFabricRollOneToManyマップ変更する必要があります。以下のように

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "fabricRoll") 
private Set<FabricDefect> fabricDefects; 

FabricDefectManyToOne(あなたのエンティティにそれが含まれている場合fabric_roll_idフィールドを削除することを忘れないでください):

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "fabric_roll_id") 
private FabricRoll fabricRoll; 

そして、あなたドンをgetAllFabricRoll()の機能の前に@Transactional(propagation = Propagation.REQUIRED)を追加する必要はありません。

関連する問題