サーチ…


前書き

JPA(Java Persistence API)ではフェッチが非常に重要です。 JPAでは、HQL(Hibernate Query Language)とJPQL(Java Persistence Query Language)を使用してエンティティをその関係に基づいてフェッチします。ネイティブSQLを使用して望むものを得るためには、非常に多くの結合クエリとサブクエリを使用するよりも優れていますが、JPAで関連エンティティを取得する方法は依然として本質的にアプリケーションのパフォーマンスに影響します。

FetchType.LAZYを使用することをお勧めします。列が必要なときにフェッチして結合します。

以下は、Employerエンティティクラスで、テーブルの雇用者に割り当てられています。ご覧のとおり、 fetch = FetchType.EAGERの代わりにfetch = FetchType.LAZYを使用しました。私がLAZYを使用している理由は、雇用主が後で多くの資産を持っている可能性があり、雇用主のすべての分野を知る必要がないたびに、すべての資産をロードすると雇用主が負担となります。

@Entity
@Table(name = "employer")
    public class Employer  
    {  
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(name = "name")
        private String Name;

        @OneToMany(mappedBy = "employer", fetch = FetchType.LAZY,
               cascade = { CascadeType.ALL }, orphanRemoval = true)
        private List<Employee> employees;
  
        public Long getId() {  
            return id;  
        }

        public void setId(Long id) {  
            this.id = id;  
        }

        public String getName() {  
            return name;  
        }

        public void setName(String name) {  
            this.name = name;  
        }

        public List<Employee> getEmployees() {  
            return employees;  
        }

        public void setEmployees(List<Employee> employees) {  
            this.employees = employees;  
        }  
    }  

ただし、LAZYフェッチの関連付けでは、初期化されていないプロキシがLazyInitializationExceptionにつながることがあります。この場合、単にHQL / JPQLでJOIN FETCHを使用してLazyInitializationExceptionを回避できます。

SELECT Employer employer FROM Employer
       LEFT JOIN FETCH employer.name
       LEFT JOIN FETCH employer.employee employee 
       LEFT JOIN FETCH employee.name
       LEFT JOIN FETCH employer.address


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow