首页 > 解决方案 > OneToOne 和 OneToMany 的延迟获取不起作用

问题描述

我有 3 个实体 Person、Employee、PeopleEmail:

@Entity
@Table(name = "PERSON")
public class Person
{
private String id;
private String lastName;
private String middleName;
private String firstName;
private Employee employee;
private Set<PeopleEmail> peopleEmail;

@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
@LazyToOne(value = LazyToOneOption.NO_PROXY)
@JoinColumns({
        @JoinColumn(name = "ID", referencedColumnName = "ID")
})
public Set<PeopleEmail> getPeopleEmail() {
    return peopleEmail;
}

public void setPeopleEmail(Set<PeopleEmail> peopleEmail) {
    this.peopleEmail = peopleEmail;
}

@OneToOne(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "ID", referencedColumnName = "EMPLOYEE_ID")
@LazyToOne(value = LazyToOneOption.NO_PROXY)
@Basic(fetch = FetchType.LAZY)
public Employee getEmployee() {
    return employee;
}

public void setEmployee (Employee employee) {
    this.employee = employee;
}
...
}

-

@Entity
@Table(name = "EMPLOYEE")
public class Employee {
  private String employeeId;
  private String spouseFirst;
  private String spouseLast;
  private String supervisorName;

  @Id
  @Column(name = "EMPLOYEE_ID", nullable = false, length = 10)
  public String getEmployeeId() {
   return employeeId;
  }

  public void setEmployeeId(String employeeId) {
   this.employeeId = employeeId;
  }
  ....
}

-

@Entity
@Table(name = "PEOPLE_EMAIL")
public class PeopleEmail
{
private String personEmailTypes;
private String personEmailAddresses;
private String personPreferredEmail;
private PeopleEmailPK peopleEmailPK;
private Long pos;

@EmbeddedId
public PeopleEmailPK getId()
{
    return peopleEmailPK;
}

public void setId(PeopleEmailPK peopleEmailPK)
{
    this.peopleEmailPK = peopleEmailPK;
}

我正在使用的数据库无法更改并且非常不规范。因此 PeopleEmailPK 主键(如果您需要查看此类,我很乐意提供)

我也将此添加到我的 pom.xml 文件中:

<plugin>
            <groupId>org.hibernate.orm.tooling</groupId>
            <artifactId>hibernate-enhance-maven-plugin</artifactId>
            <version>5.0.12.Final</version>
            <executions>
                <execution>
                    <configuration>
                        <failOnError>true</failOnError>
                        <enableLazyInitialization>true</enableLazyInitialization>
                        <enableDirtyTracking>true</enableDirtyTracking>
                        <enableAssociationManagement>true</enableAssociationManagement>
                        <enableExtendedEnhancement>false</enableExtendedEnhancement>
                    </configuration>
                    <goals>
                        <goal>enhance</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

问题是无论我做什么,我都无法让 Employee 和 PeopleEmail 延迟加载。当我调用与 Person 相关的任何内容时,它会运行 3 个查询。

为了它的价值,我在 Spring Boot 项目中使用 Hibernate 5.0.12

标签: javahibernatespring-bootjpa

解决方案


推荐阅读