2017-12-10 11 views
0

問題文を実行します。JPAで、私は連絡先のオブジェクトを取得することが期待EntityManager火災選択クエリとしてJPAは、Hibernateは、複数の選択クエリに内部

Contact contact = entityManager.find(Contact.class, Integer.valueOf(contactId));

メソッドを実行休止状態、それの後に、それは別の選択を発射します私が欲しくない顧客オブジェクトを取得するためのクエリ。
カスタマーオブジェクトは連絡先オブジェクトの子オブジェクトです。
contact entiryには、外部キーcustomerIdがあります。

Requirment:1つのselectクエリを実行して、contactオブジェクトを取得し、それ以降は何も実行しないで、2番目のselectクエリもjoinクエリではないようにします。 接触対象:

@Entity 
@Table(name = "contact") 
public class Contact { 
    @JsonProperty("contactId") 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "Id") 
    int contactId; 

    @Column(name = "firstname") 
    @JsonProperty("firstName") 
    String firstName; 

    @Column(name = "lastname") 
    @JsonProperty("lastName") 
    String lastName; 

    @Column(name = "phone1") 
    @JsonProperty("phone1") 
    String phone1; 

    @ManyToOne(optional = false, fetch = FetchType.LAZY, targetEntity = Customer.class) 
    @JoinColumn(name = "customer_id", updatable = false) 
    @Fetch(FetchMode.JOIN) 
    Customer customer; 

    public Customer getCustomer() { 
     return customer; 
    } 

    public void setCustomer(Customer customer) { 
     this.customer = customer; 
    } 
} 
+0

いいえ、find()を実行するとそのクエリは実行されません。 JSONへの連絡先をシリアル化するときにはおそらくそのクエリを実行するでしょう:あなたはコンタクトの顧客をシリアル化することを避けるようジャクソンに指示しなかったので、ジャクソンはそれをシリアル化するため、Hibernateは顧客の状態をロードするためにqeryを実行する必要があります。 –

+0

お探しのコードを追加してください –

答えて

2

は、私はあなたの問題は、遅延読み込みと一緒に@Fetch(FetchMode.join)を使用してから来ていると思います。あなたが熱心にお客様をロードしたくないなら、あなたは@Fetch(FetchMode.join)を削除し、のみ

はこちらこのについての詳細に関する情報(https://stackoverflow.com/a/29667050/2637940)を参照してください遅延読み込みを使用する必要がありますの

ファーストを@Fetch(FetchMode.JOIN)と@ManyToOne(fetch = FetchType.LAZY)は拮抗しています.1つはEAGERフェッチを指示し、もう1つはLAZYフェッチを示唆します。

関連する問題