【问题标题】:JPA hibernate executes multiple select query internallyJPA hibernate 在内部执行多个选择查询
【发布时间】: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 来加载客户的状态。
  • 能否请您添加用于查找联系人的代码

标签: java hibernate jpa


【解决方案1】:

我认为您的问题来自使用 @Fetch(FetchMode.join) 和延迟加载。如果您不想急切地加载客户,那么您应该删除 @Fetch(FetchMode.join) 并且只使用延迟加载

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2023-03-11
    • 2017-10-23
    • 2021-12-14
    • 2013-06-10
    • 2020-09-26
    相关资源
    最近更新 更多