@ManyToOne懒惰加载无法正常工作

时间:2014-11-12 11:42:32

标签: jpa

我已经看到有关此问题的其他帖子,但找不到我自己的麻烦的答案。我有

    @Entity
    @Table(name= ServerSpringConstants.COMPANY)
    public class Company implements Serializable {
    private static final long serialVersionUID = -9104996853272739161L;

    @Id @GeneratedValue(strategy=GenerationType.AUTO)
    @Column (name = "companyID")
    private long companyID;

    @OneToMany (targetEntity = Division.class, cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE,
            CascadeType.REFRESH},
            fetch = FetchType.EAGER)
    @JoinTable (name = "companyDivisionJoinTable",
            joinColumns = @JoinColumn(name="companyID"),
            inverseJoinColumns = @JoinColumn(name="divisionID")
    )
    private Set<Division> divisions = new HashSet<>();

    public long getCompanyID() {
        return companyID;
    }

    public Set<Division> getDivisions() {
        return divisions;
    }

    public void setDivisions(Set<Division> divisions) {
        this.divisions = divisions;
    }
}

另一方面:

@Entity
@Table(name= ServerSpringConstants.DIVISION)
public class Division implements Serializable {

    private static final long serialVersionUID = -3685914604737207530L;

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    @Column(name = "divisionID")
    private long divisionID;

    @ManyToOne
            (fetch = FetchType.LAZY, optional = false, targetEntity = Company.class,
            cascade = {CascadeType.PERSIST, CascadeType.MERGE
            }
            )
    @JoinColumn(name="companyID", referencedColumnName = "companyID")
    private Company company;

    public long getDivisionID() {
        return divisionID;
    }

    public void setDivisionID(long divisionID) {
        this.divisionID = divisionID;
    }

    public Company getCompany() {
        return company;
    }

    public void setCompany(Company company) {
        this.company = company;
    }

}

但由于某种原因,LAZY装载不起作用。我正在使用JPA。我在“用户”类中回调这些公司及其附属部门 - 相关部分

 @ManyToMany (targetEntity = Company.class,
        cascade={
                CascadeType.PERSIST,
                CascadeType.MERGE,
                CascadeType.REFRESH},
        fetch=FetchType.EAGER )
@JoinTable (
        name="companyUserJoinTable",
        joinColumns=@JoinColumn(name="userID"),
        inverseJoinColumns=@JoinColumn(name="companyID")
)
private Set<Company> company = new HashSet<>();

我搜索了现有的帖子,并尝试添加各种建议,但没有任何帮助! 任何帮助表示赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

由于您正在急切地加载分区(使用fetch = FetchType.EAGER)并且您具有双向关联,因此将使用对公司的父引用初始化分区。我看不出有任何问题。 Jpa加载了完整的对象树,因为你刚刚告诉它。公司包含分部,其中包含对加载它们的公司的反向引用。 为了更好地理解它,因为延迟加载的原因是减少从数据库加载的数据,所以拥有公司已经加载了部门的会话,那么为什么不设置关联呢?

如果先加载分区,则另一方的@ManyToOne关联生效。

为了使映射更正确,还可以在关联的一部分添加@MappedBy属性。这不会影响提取行为,但会阻止对关联两端发出的数据库进行双重更新。