我有 3 个具有简单关系的对象,如下所示:
大学:
@Entity
public class University {
@Id
@GeneratedValue
private Long id;
private String name;
}
师资队伍:
@Entity
public class Faculty {
@Id
@GeneratedValue
private Long id;
private String name;
@Column(name = "university_id", nullable = false)
private Long universityId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinFetch(value = JoinFetchType.OUTER)
@JoinColumn(name = "university_id", insertable = false, updatable = false, nullable = false)
private University university;
}
专长:
@Entity
public class Specialty {
@Id
@GeneratedValue
private Long id;
private String name;
@Column(name = "faculty_id", nullable = false)
private Long facultyId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinFetch(value = JoinFetchType.OUTER)
@JoinColumn(name = "faculty_id", insertable = false, updatable = false, nullable = false)
private Faculty faculty;
}
我正在使用 EclipseLink 和 Spring CrudRepository 来操作这些实体。 当我打电话时
specialtyRepository.findAll();
我得到了sql
SELECT * FROM specialty LEFT OUTER JOIN faculty ON (faculty.ID = specialty.faculty_id) ...
以及额外的sql,例如
SELECT * FROM university WHERE ((ID = ?)) ...
我想阻止这个sql请求;
有人可以告诉我如何解决这个问题吗? 谢谢您的任何提示
最佳答案
对于 @ManyToOne 中的延迟加载,我必须在 EclipseLink 中启用动态编织: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Advanced_JPA_Development/Performance/Weaving
我通过继承解决了这个问题; 我创建了没有关系的基础实例;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class FacultyBase {
@Id
@GeneratedValue
private Long id;
private String name;
@Column(name = "university_id", nullable = false)
private Long universityId;
}
以及具有关系的实例
@Entity
public class Faculty extends Faculty {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "university_id", insertable = false, updatable = false, nullable = false)
private University university;
}
因此,在专业实例中,我使用FacultyBase而不是Faculty
关于java - Spring Boot JPA - ManyToOne关系导致额外的sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58898813/