JPA/Hibernate查询速度慢,查询太多

JPA/Hibernate查询速度慢,查询太多,hibernate,jakarta-ee,jpa,entity,Hibernate,Jakarta Ee,Jpa,Entity,我有两个实体员工和部门 Employee实体是我的应用程序的只读数据集(我不拥有此表) 支持我拥有的部门实体的表数据。如果我查询我的Employee实体而不向Employee实体关系注释Department,则该查询是超快速的,因为它只生成一个SQL调用 只要我将部门关系注释到员工实体中,就会有大量SQL调用。以下是我认为有助于获得帮助的每个实体的相关细节: @Entity Employee @Id String employee_number; String first_name; Strin

我有两个实体
员工
部门

Employee
实体是我的应用程序的只读数据集(我不拥有此表)

支持我拥有的
部门
实体的表数据。如果我查询我的
Employee
实体而不向
Employee
实体关系注释
Department
,则该查询是超快速的,因为它只生成一个SQL调用

只要我将
部门
关系注释到
员工
实体中,就会有大量SQL调用。以下是我认为有助于获得帮助的每个实体的相关细节:

@Entity
Employee
@Id
String employee_number;
String first_name;
String last_name;
String phone_number;
@Column(name="dept")
private String home_dept_number;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="dept", referencedColumnName="dept_number", insertable = false, updatable = false)
@NotFound(action = NotFoundAction.IGNORE)
private Department department;


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="dept", referencedColumnName="department_number", insertable = false, updatable = false)


我的猜测是,这种缓慢是由
@NotFound
注释造成的:Hibernate可能被迫检查这个部门是否真的存在


使用
@NotFound
是一种黑客行为,目的是为了补偿员工引用不存在的部门的不一致数据库。如果您的数据库是一致的(并且应该由外键约束强制执行),您就不需要这些注释。

我的猜测是,缓慢是由
@NotFound
注释造成的:Hibernate可能被迫检查部门是否真的存在


使用
@NotFound
是一种黑客行为,目的是为了补偿员工引用不存在的部门的不一致数据库。如果您的数据库是一致的(并且应该由外键约束强制执行),您就不需要这些注释。

我的猜测是,缓慢是由
@NotFound
注释造成的:Hibernate可能被迫检查部门是否真的存在


使用
@NotFound
是一种黑客行为,目的是为了补偿员工引用不存在的部门的不一致数据库。如果您的数据库是一致的(并且应该由外键约束强制执行),您就不需要这些注释。

我的猜测是,缓慢是由
@NotFound
注释造成的:Hibernate可能被迫检查部门是否真的存在


使用
@NotFound
是一种黑客行为,目的是为了补偿员工引用不存在的部门的不一致数据库。如果您的数据库是一致的(并且应该由外键约束强制执行),则不需要这些注释。

作为起点,将optional=false添加到所有非可选单端关联中,然后查看它是如何处理的。如果告诉您执行了哪些查询(JPQL和SQL),这会有所帮助。我的猜测是,这种缓慢是由NotFound注释造成的:Hibernate可能被迫检查这个部门是否真的存在。使用NotFound是一种黑客行为,目的是为了补偿员工引用不存在的部门的不一致数据库。如果您的数据库是一致的(并且应该由外键约束强制执行),则不需要这些注释。是的!我很高兴看到你@jbnize没有回应。你就是那个人!就这样。当我删除@NotFound(action=NotFoundAction.IGNORE)时,只进行了1次SQL调用,尽管查询结果是针对许多员工的。在我得到与人们找到的相同数量的SQL查询之前。@JBNizet作为答案响应,我将接受。请评论一下,我在员工实体中仍然有字符串home\u dept\u number,在这篇文章中,你说它没有用。我想为什么要加载部门实体,而我只需要员工的部门号。如果实体是只读的,我想可以。但是,在同一列上映射两个不同的关联没有多大意义。作为起点,将optional=false添加到所有非可选的单端关联中,然后查看它是如何处理的。如果告诉您执行了哪些查询(JPQL和SQL),这会有所帮助。我的猜测是,这种缓慢是由NotFound注释造成的:Hibernate可能被迫检查这个部门是否真的存在。使用NotFound是一种黑客行为,目的是为了补偿员工引用不存在的部门的不一致数据库。如果您的数据库是一致的(并且应该由外键约束强制执行),则不需要这些注释。是的!我很高兴看到你@jbnize没有回应。你就是那个人!就这样。当我删除@NotFound(action=NotFoundAction.IGNORE)时,只进行了1次SQL调用,尽管查询结果是针对许多员工的。在我得到与人们找到的相同数量的SQL查询之前。@JBNizet作为答案响应,我将接受。请评论一下,我在员工实体中仍然有字符串home\u dept\u number,在这篇文章中,你说它没有用。我想为什么要加载部门实体,而我只需要员工的部门号。如果实体是只读的,我想可以。但是,在同一列上映射两个不同的关联没有多大意义。作为起点,将optional=false添加到所有非可选的单端关联中,然后查看它是如何处理的。如果告诉您执行了哪些查询(JPQL和SQL),这会有所帮助。我的猜测是,这种缓慢是由NotFound注释造成的:Hibernate可能被迫检查这个部门是否真的存在。使用NotFound是一种黑客行为,目的是为了补偿员工引用不存在的部门的不一致数据库。如果您的数据库是一致的(并且应该由外键约束强制执行),则不需要这些注释。是的!我很高兴看到你@jbnize没有回应。你就是那个人!就这样。当我删除@NotFound(action=NotFoundAction.IGNORE)时,只进行了1次SQL调用,尽管查询结果是针对许多员工的。在我得到与人们找到的相同数量的SQL查询之前。@JBNizet作为答案响应,我将接受。请注意,我在员工实体中仍然有字符串home\u dept\u number,其中
@Entity    
Department
@Id
String dept_number
String dept_name;

@OneToOne(fetch = FetchType.LAZY)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name = "department_manager_id", referencedColumnName = "employee_number")
private Employee departmentManager;

@OneToOne(fetch = FetchType.LAZY)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name = "department_admin_aide_id", referencedColumnName = "employee_number")
private Employee departmentAdminAide;

@OneToOne(fetch = FetchType.LAZY)
@NotFound(action=NotFoundAction.IGNORE)
@JoinColumn(name = "department_rep_id", referencedColumnName = "employee_number")
private Employee departmentRepresentative;