有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSpringBootJPAManyOne关系导致额外的sql

我有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 Crudepository来处理这些实体。 当我打电话时

specialtyRepository.findAll();

我懂sql

SELECT * FROM specialty LEFT OUTER JOIN faculty ON (faculty.ID = specialty.faculty_id) ...

还有额外的sql之类的

SELECT * FROM university WHERE ((ID = ?)) ...

我想阻止这个sql请求

有人能告诉我如何解决这个问题吗? 谢谢你的提示


共 (1) 个答案

  1. # 1 楼答案

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