【发布时间】:2023-03-28 19:15:02
【问题描述】:
问题陈述:在JPA hibernate中我执行一个方法
Contact contact = entityManager.find(Contact.class, Integer.valueOf(contactId));
正如预期的那样,EntityManager 触发一个选择查询以获取联系人对象,但之后它触发另一个选择查询以获取我不想要的客户对象。
客户对象是联系人对象中的子对象。
联系人条目有一个外键 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;
}
}
【问题讨论】:
-
不,执行 find() 时不会执行该查询。当您将 Contact 序列化为 JSON 时,它很可能会执行该查询:您没有告诉 Jackson 避免序列化 contct 的客户,因此 Jackson 将其序列化,因此 Hibernate 需要执行 qery 来加载客户的状态。
-
能否请您添加用于查找联系人的代码