为什么在ManyToOne关系中使用Hibernate的FetchType.EAGER或fetch = FetchType.LAZY会出错?

13 浏览
0 Comments

为什么在ManyToOne关系中使用Hibernate的FetchType.EAGER或fetch = FetchType.LAZY会出错?

在我的Spring Boot应用程序中,我正在使用Hibernate。我有一个多对一的关系,如下所示:\n@Entity\n@Table(name = \"STUDENT\")\n@JsonIdentityInfo(\n generator = ObjectIdGenerators.PropertyGenerator.class,\n property = \"id\")\npublic class Student {\n @Id\n @GeneratedValue(strategy = GenerationType.IDENTITY)\n private Long id;\n @Column\n private String name;\n @Column\n private int mobile;\n @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)\n @JoinColumn(name = \"DEPT_ID\", nullable = false)\n private Department department;\n public Long getId() {\n return id;\n }\n public void setId(Long id){\n this.id = id;\n }\n public String getName() {\n return name;\n }\n public void setName(String name) {\n this.name = name;\n }\n public int getMobile() {\n return mobile;\n }\n public void setMobile(int mobile) {\n this.mobile = mobile;\n }\n public Department getDepartment() {\n return department;\n }\n public void setDepartment(Department department) {\n this.department = department;\n }\n @Override\n public String toString() {\n return \"Student{\" +\n \"id=\" + id +\n \", name=\'\" + name + \'\\\'\' +\n \", mobile=\" + mobile +\n \", department=\" + department +\n \'}\';\n }\n}\n和:\n@Entity\n@Table(name = \"DEPARTMENT\")\n@JsonIdentityInfo(\n generator = ObjectIdGenerators.PropertyGenerator.class,\n property = \"id\")\npublic class Department {\n @Id\n @GeneratedValue(strategy = GenerationType.IDENTITY)\n private Long id;\n @Column\n private String name;\n @OneToMany(mappedBy = \"department\", fetch = FetchType.EAGER, cascade = CascadeType.ALL)\n private List studentList=new ArrayList();\n public Long getId() {\n return id;\n }\n public void setId(Long id) {\n this.id = id;\n }\n public String getName() {\n return name;\n }\n public void setName(String name) {\n this.name = name;\n }\n public List getStudentList() {\n return studentList;\n }\n public void setStudentList(List studentList) {\n this.studentList = studentList;\n }\n}\n对于Department的fetch = FetchType.LAZY和fetch = FetchType.EAGER都可以正常工作。\n为了更好地理解,我将Student的@ManyToOne(fetch = FetchType.EAGER)切换为@ManyToOne(fetch = FetchType.LAZY)。当fetch = FetchType.LAZY时,它会出现以下错误:\n\"Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->com.myjavablog.model.Student[\"department\"]->com.myjavablog.model.Department$HibernateProxy$w9HG3Rv0[\"hibernateLazyInitializer\"])\"\n为什么会发生这种情况?为什么我不能对学生使用fetch type lazy?提前感谢!

0
0 Comments

问题:为什么在ManyToOne关系中使用Hibernate的FetchType.EAGER或fetch = FetchType.LAZY会出现问题?

原因:

在使用Hibernate进行数据库操作时,当存在ManyToOne关系时,有可能会出现一些问题。其中一个问题是在生成JSON输出时,可能会导致属性被忽略。另一个问题是当存在延迟加载的属性时,也可能会出现问题。为了解决这些问题,可以使用Hibernate提供的注解来处理。

解决方法:

1. 忽略生成JSON输出的属性:

可以使用以下代码来忽略生成JSON输出的属性:

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

2. 处理延迟加载的属性:

当存在延迟加载的属性时,可以使用以下代码来处理:

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

通过以上方法,可以解决在使用Hibernate的FetchType.EAGER或fetch = FetchType.LAZY时可能出现的问题。感谢社区的建议。

0