2013-02-06 3 views
4

@ManyToOne 관계는 잘 작동 :이 Telefoni 테이블에서 하나의 행을 가져 오는, 1 SQL 쿼리를 실행하고 약 10ms의 지속복합 관계없이

@Entity 
@Table 
public class Telefoni{ 
    ... other fields not included for simplicity sake 

    private DjecaRoditelja djecaRoditelja; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "IDDjeteta", referencedColumnName = "IDDjeteta") 
    public DjecaRoditelja getDjecaRoditelja() { 
     return this.djecaRoditelja; 
    } 

    public void setDjecaRoditelja(DjecaRoditelja djecaRoditelja) { 
     this.djecaRoditelja = djecaRoditelja; 
    } 
} 

... 

// in some DAO method 
tel = entityManager.find(Telefoni.class, primaryKey); 

.

@Entity 
@Table 
public class Telefoni{ 
    ... other fields not included for simplicity sake 

    private KontaktOsobe kontaktOsobe; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumns({ 
      @JoinColumn(name = "KORISNIK", referencedColumnName = "korisnik"), 
      @JoinColumn(name = "PARTNER", referencedColumnName = "Partner"), 
      @JoinColumn(name = "SifraKonOs", referencedColumnName = "SifraOsobe") }) 
    public KontaktOsobe getKontaktOsobe() { 
     return this.kontaktOsobe; 
    } 

    public void setKontaktOsobe(KontaktOsobe kontaktOsobe) { 
     this.kontaktOsobe = kontaktOsobe; 
    } 
} 

... 

// in some DAO method 
tel = entityManager.find(Telefoni.class, primaryKey); 

이것은 모든 관계가 해결 될 때까지 열심히 모든 부모 개체와 모든 부모의 부모를 가져 오는 37 개 SQL 쿼리를 실행합니다

그러나 lazy 페칭은 복합 @JoinColumns 어떤 @ManyToOne 관계를 추가 할 때 작동을 멈 춥니 다. 약 600ms 동안 지속됩니다.

내 엔티티에 하나의 추가 릴레이션을 추가하면 성능이 60 배나 떨어집니다. 데이터베이스 모델을 변경하는 것 외에는 복합 릴레이션을 사용하기 위해 게으른 페칭을 수행 할 수있는 방법이 있습니까?

편집 :

더 자세하게 조사 후 문제가 복합 관계와 관련,하지만 관계는 JPA/최대 절전 모드가 기본 키가 정의되어 있지 않은 이상 아무것도 물마루되지 않습니다.

따라서 식별 열과 고유 한 자연스러운 테이블 및 여러 테이블이 서로 관련되어있는 경우 - 열심히 가져 와서 다른 테이블을 넣으려면 어느 것이 덜 비참 할 지 결정해야합니다. Hibernate의 기본 키로 사용된다.

답변

0

관련된 테이블 KontaktOsobe에서 기본 키는 관계를 구성하는 구성 요소로 구성된 @EmbeddedId 여야합니다.

@Entity 
@Table 
public class KontaktOsobe{ 
    private KontaktOsobePK pk; 

    @EmbeddedId 
    public KontaktOsobePK getPk() { 
     return pk; 
    } 
    // ... 
} 

@Embeddable 
public class KontaktOsobePK implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private String sifraOsobe; 
    private String partner; 
    private String korisnik; 

    // getters, setters, equals and hashode methods go here... 
} 

당신은 또한 (즉 autoincremental 신원 필드) 다른 필드를 대상으로 관계를 가지고있는 동시에, 당신은 lazy 페칭이 작동하는 결정해야하는 경우 ...