코린이의 기록

[hibernate] org.hibernate.event.internal.DefaultLoadEventListener - HHH000327: Error performing load command 본문

Framework/hibernate

[hibernate] org.hibernate.event.internal.DefaultLoadEventListener - HHH000327: Error performing load command

코린이예요 2019. 2. 19. 19:52
반응형

org.hibernate.event.internal.DefaultLoadEventListener - HHH000327: Error performing load command


Service Implement 부분에서 SQL 실행하다가 발생한 오류 

1
2
3
4
5
@SuppressWarnings("unchecked")
     public List<DeviceSwVersion> findByDeviceId(String deviceId) {
         return super.entityManager.createQuery("select r from DeviceSwVersion r where r.deviceSwVersionPK.id = :id").setParameter("id", deviceId)
                 .getResultList();
     }
cs


아무리 봐도 Query문은 문제가 없는것 같다.


원인이 무엇일까... 삽질 하다가  

아래 ManyToOne annotation에서 "fetch = FetchType.LAZY"를 뺐더니 제대로 동작하였다. 

1
2
3
4
    /*@ManyToOne(fetch = FetchType.LAZY, optional = false)*/
    @ManyToOne(optional = false)
    @JoinColumn(name = "swVersionId", referencedColumnName = "id", insertable = false, updatable = false)
    private  SwVersion swVersion;
cs



여기서 FetchType.LAZY는 무엇을 의미하는가? 

를 알기전에 즉시로딩 & 지연로딩의 의미를 알아야한다.


즉시로딩

엔티티 매니저를 통해 엔티티를 조회하면 연관관계에 매핑되어 있는 엔티티도 함께 조회


지연로딩

엔티티 매니저를 통해 엔티티를 조회하면 연관관계에 매핑되어 있는 엔티티를 실제 사용할 때 조회



위 SwVersion은 deviceSwVersion과 연관관계가 있다. (@ManyToOne과 @OneToMany 어노테이션쪽을 보면 알 수 있다.)

1
2
@OneToMany(cascade = CascadeType.ALL, mappedBy = "swVersion")
    private List<DeviceSwVersion> deviceSwVersion = new ArrayList<DeviceSwVersion>();
cs



즉시 로딩으로 조회할경우, 

deviceSwVersion의 엔티티를 조회할때 동시에 swVersion에 속한 엔티티를 동시에 조회하게 된다.

하지면 여기서 지연로딩 옵션을 설정하여 지연로딩으로 조회하게될 경우 실제적으로 DB에서 swVersion속한 엔티티를 조회하지 않는다. 대신 deviceSwVersion 엔티티의 swVersion변수에 프록시 객체를 넣어둔다. 이 프록시 객체는 실제 사용될때까지 DB를 조회하지 않고 데이터 로딩을 미루어 지연 로딩을 하게 된다.




그래서..? 

지연로딩을 하면 조회가 안되고 지연로딩으로 조회를해야 제대로 동작하는지 원인은 조금더 살펴보아야 할것 같다 ㅠㅠ



Reference : https://lng1982.tistory.com/278

Reference : https://victorydntmd.tistory.com/210

반응형
Comments