【问题标题】:Why Hibernate FetchType.EAGER or fetch = FetchType.LAZY in ManyToOne relationship breaks [duplicate]为什么ManyToOne关系中的Hibernate FetchType.EAGER或fetch = FetchType.LAZY会中断[重复]
【发布时间】:2020-11-02 09:31:31
【问题描述】:

在我的 Spring Boot 应用程序中,我使用的是休眠。我的多对一关系如下:-

@Entity
@Table(name = "STUDENT")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @Column
    private int mobile;

    @ManyToOne( fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "DEPT_ID", nullable = false)
    private Department department;

    public Long getId() {
        return id;
    }

    public void setId(Long id){
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMobile() {
        return mobile;
    }

    public void setMobile(int mobile) {
        this.mobile = mobile;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", mobile=" + mobile +
                ", department=" + department +
                '}';
    }
}

如:-

@Entity
@Table(name = "DEPARTMENT")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id")
public class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String name;

    @OneToMany(mappedBy = "department", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Student> studentList=new ArrayList<Student>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Student> getStudentList() {
        return studentList;
    }

    public void setStudentList(List<Student> studentList) {
        this.studentList = studentList;
    }
}

对于 Department 的 fetch = FetchType.LAZY 和 fetch = FetchType.EAGER 都可以正常工作。

为了更好地理解,我将 Student 的 @ManyToOne(fetch = FetchType.EAGER) 切换为 @ManyToOne(fetch = FetchType.LAZY)。当 FetchType.LAZY:-

“类型定义错误:[简单类型,类 org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor];嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类 org.hibernate 的序列化程序。 proxy.pojo.bytebuddy.ByteBuddyInterceptor 并且没有发现创建 BeanSerializer 的属性(为避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS)(通过参考链:java.util.ArrayList[0]->com.myjavablog.model.Student["department" ]->com.myjavablog.model.Department$HibernateProxy$w9HG3Rv0["hibernateLazyInitializer"])"

为什么会这样?为什么我不能为学生做懒惰的取类型?提前致谢!

【问题讨论】:

标签: java spring-boot hibernate


【解决方案1】:

您可以通过忽略来生成属性的 JSON 输出

@JsonIgnore 

或者如果你有任何延迟加载的属性有关系。您可以在属性顶部使用此注解。

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 

这解决了我的问题。感谢社区的建议。

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2018-07-22
    • 2016-10-25
    相关资源
    最近更新 更多