2017-04-24 9 views
1

모든 하위 연결이 필요없는 개체를 가져 오는 데 문제가 있습니다.
은 내가
게으른로드가 작동하지 않습니다. - 모든 연결이 아니라 부모 개체 만 필요합니다.

 



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


이 난 단지 내 순서 표 협회
순서없이 사이트 개체를 필요

 

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

나의 수준의 사이트가나는이 오류가 발생할 수

 

    @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 Serializer)에 액세스하려고 시도하며 세션이 없으므로로드 할 수 없습니다. –

답변

2

를 해결하는 방법에 대해 설명합니다.

그러나 eager를 사용하면 해당 엔티티가 포함 된 모든 쿼리에 영향을 미칩니다.

열거 대신 쿼리에서 조인 가져 오기를 사용해보십시오.

+0

예 동의합니다. 그러나 열의 대신에 쿼리에서 조인 가져 오기가 너무 열심히 영향을 미칩니다. 열망 만 사용하는 것과 같습니다. – Adams

0

코드의 어느 부분에서 Site.GetSequences()이라고 부르거나 코드의 다른 부분을 반복 할 수 있습니다. 그것은 당신이 준 코드가 예외를 생성하고있는 것처럼 보이지 않습니다.

엔티티에로드되지 않은 콜렉션을 사용하려고하면, 언급 한 예외가 코드에서 throw됩니다.

이 문제를 해결하려면, sequences를 사용하는 위치를 식별하고이 EAGER에 가져 변경하거나 조회에서을 join fetch를 사용하여 사용하기 전에 그들을로드합니다.

+0

도움을 주셔서 감사합니다. 나는 그것을 부를 수있는 모든 GetSequences에 대해 의견을 말합니다. 하지만, 제 질문은 : 내가 가져 오기 결합을 사용하면 모든 시퀀스 요소 (열망을 사용하는 것과 같습니다)를 얻을 것이고 시퀀스를 가져올 필요가 없습니다. 모든 의존성을 가지지 않고 사이트 개체가 필요합니다. – Adams

0

최대 절전 모드 관리 엔터티 (또는 최대 절전 모드 관리 엔터티 컬렉션)는 반환되는 항목과 세션을 사용할 수있을 때 최대 절전 모드로 채워진 항목에 매우주의하지 않는 한 이러한 종류의 문제를 유발할 가능성이 큽니다.

DTO (또는 DTO 모음)를 만들고 원하는 방식으로 입력란을 채우는 것이 좋습니다. DTO 변환 프레임 워크에는 많은 엔티티가 있습니다. 내 즐겨 찾기는 ModelMapper입니다.

또한 FetchType을 사용하여 재생할 다른 제안에 동의하는 경향이 있지만 DTO가 채워지기 때문에 주석에 기반한 최대 절전 모드로 채워진 엔티티 관계와 달리 우리가 채운 내용을 알 수 있습니다.

DTO에서 뭔가가 필요한 경우 해당 엔터티에 요청하면 해당 시점에 세션을 사용할 수 있으므로 UI에서 필요하다고 생각하는 필드를 채울 수 있습니다.

DTO와 엔터티에이 주제를 납치하고 싶지는 않으나 그렇게 할 것입니다.

이 당신은 오해되어 너무 Avoid Jackson serialization on non fetched lazy objects