问题陈述:在JPA休眠状态下,我执行一个方法

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

正如预期的那样,EntityManager触发一个选择查询以获取联系人对象,但是此后,它触发另一个选择查询以获取我不需要的客户对象。
客户对象是联系对象中的子对象。
contact entiry有一个外键customerId。

要求:我希望EntityManager触发一个选择查询以获取联系人对象,然后再执行第二次选择查询或联接查询。
接触对象:

@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;
    }
}

最佳答案

我认为您的问题来自与延迟加载一起使用@Fetch(FetchMode.join)。如果您不想急于加载客户,则应删除@Fetch(FetchMode.join),仅使用延迟加载

在此处(https://stackoverflow.com/a/29667050/2637940)查看与此有关的更多信息:


  首先,@Fetch(FetchMode.JOIN)和@ManyToOne(fetch =
  FetchType.LAZY)是对立的,它指示EAGER进行抓取,
  另一个则建议进行LAZY抓取。

07-24 19:10
查看更多