Java Hibernate@OneToMany@ManyToOne映射
每个人我都有一个关于使用注释的问题Java Hibernate@OneToMany@ManyToOne映射,java,hibernate,Java,Hibernate,每个人我都有一个关于使用注释的问题@OneToMany/@ManyToOne;是否可以在此模型中创建一个包含两组主题的用户模型(针对教师和参与学生进行),而不是创建单独的学生和教师模型?我写了这样一个代码,但是当我想要获取关于项目和用户的数据时,hibernate会崩溃“堆栈溢出”错误 用户实体: @Entity public class User{ @OneToMany( mappedBy = "student", cascade = C
@OneToMany
/@ManyToOne
;是否可以在此模型中创建一个包含两组主题的用户模型(针对教师和参与学生进行),而不是创建单独的学生和教师模型?我写了这样一个代码,但是当我想要获取关于项目和用户的数据时,hibernate会崩溃“堆栈溢出”错误
用户实体:
@Entity
public class User{
@OneToMany(
mappedBy = "student",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
private Set<Item> items = new HashSet<>();
@OneToMany(mappedBy = "teacher",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
private Set<Item> carriedItems= new HashSet<>();
}
//id and other data
感谢@Leviand的帮助,根据您的评论,您的代码和逻辑似乎需要重新编写。 首先,使用两个专用类代替
Item
pojo:
@Entity
@Table(name = Studend) // I'm guessing a table name
public class Student{
@JoinColumn(name = "student_id", nullable = false)
private User user;
}
@Entity
@Table(name = Teacher) // I'm guessing a table name
public class Teacher{
@JoinColumn(name = "teacher_id", nullable = false)
private User user;
}
然后,由于用户
只能连接到单个教师
或学生
,因此,请将其重构为:
@Entity
@Table(name = User) // I'm guessing a table name
public class User{
@OneToOne(
mappedBy = "student",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
private Student student;
@OneToMany(mappedBy = "teacher",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
private Teacher teacher;
}
希望这有帮助:)为什么你要创建一个通用的
项目类而不是学生和教师类?我想知道这是否是一个更好的解决方案,因为用户有角色(“教师”或“学生”)如果我创建了教师和学生实体角色,那么就不需要第二个问题:一个用户怎么可能连接到多个教师/学生?这是正确的吗?嗯,那么最好是使用FK连接它?此外,如果我创建学生和教师,那么我必须创建不同的存储库、服务等。下一个问题是日志记录,如果我没有角色,如何识别谁被记录。我使用Spring ReTiTts帮助了一点,但是我认为NAD是模型数据库:如果你的数据库看起来像那个图像,我所发布的代码是正确的:
@Entity
@Table(name = User) // I'm guessing a table name
public class User{
@OneToOne(
mappedBy = "student",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
private Student student;
@OneToMany(mappedBy = "teacher",
cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
orphanRemoval = true
)
private Teacher teacher;
}