问题陈述:在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抓取。