2017-10-23 7 views
3

@OneToMany의 관계는 FabricRollFabricDefect 사이입니다. 나는 동료 FabricDefect도로드Spring Data, JPA @OneToMany Spring Boot에서 작동하지 않는 지연 가져 오기

JpaRepository 기능

findall은()에 의해 FabricRoll를 얻을 때

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

문제

입니다. enter image description here

:

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

+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가 호출됩니다에만 DB를 쿼리합니다, 느리게로드. 로깅을 사용 설정하면 직접 볼 수 있습니다.

0

해결책을 찾은 사람은 this tutorial입니다.

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

를 그리고 돈

당신은 다음과 FabricRollOneToMany지도를 수정해야 getAllFabricRoll() 기능 전에 @Transactional(propagation = Propagation.REQUIRED)을 추가해야합니다.