Spring Boot JPA-ManyToOne关系会导致额外的SQL

问题描述 投票:0回答:1

我有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

选择*从专职左外加入专职教授(faculty.ID = Specialty.faculty_id)...

和其他类似的SQL

选择*从大学((ID =?))...

我想阻止此sql请求;

有人可以告诉我如何解决此问题吗?谢谢你的提示

java spring-boot jpa eclipselink
1个回答
0
投票

对于@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

© www.soinside.com 2019 - 2024. All rights reserved.