【问题标题】:Hibernate @OneToMany @ManyToOne mappingHibernate @OneToMany @ManyToOne 映射
【发布时间】:2018-07-27 07:41:40
【问题描述】:

我对使用注释 @OneToMany/@ManyToOne 有疑问的每个人;是否可以在此模型中创建一个具有两组主题的用户模型(为教师进行并参加学生),而不是创建单独的学生和教师模型?我写了这样的代码,但是当我想获取有关项目和用户的数据时,hibernate 会崩溃“堆栈溢出”错误。我将添加我使用 H2 数据库。

用户实体:

@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

物品实体:

@Entity
public class Item{
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "student_id", nullable = false)
    private User student;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "teacher_id", nullable = false)
    private User teacher;
}
//id and other data

感谢@Leviand 的帮助

【问题讨论】:

  • 为什么要创建一个通用的Item 类而不是Student 和Teacher 类?
  • 我想知道这对于我的项目是否是一个更好的解决方案,因为用户有角色(“教师”或“学生”),如果我创建了教师和学生实体角色,则不需要它
  • 第二个问题:一个用户怎么可能连接到多个教师/学生?对吗?
  • hmm,那不如用FK连接?
  • 除了创建学生和教师之外,我还必须创建不同的存储库、服务等。下一个问题将是登录,如果我没有角色,如何识别谁登录。我用弹簧架

标签: java hibernate


【解决方案1】:

根据您的 cmets,您的代码和逻辑看起来需要一些返工。 首先,使用两个专用类代替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;
}

那么由于User 只能连接到单个Teacher 或Student,因此将其重构为:

@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;
}

希望这会有所帮助:)

【讨论】:

  • 它有点帮助,但我认为模型数据库没有:imgur.com/a/nk9uWhh
  • 如果您的数据库看起来像该图像,那么我发布的代码是正确的:)
猜你喜欢
  • 2019-02-24
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 2011-11-15
  • 2020-09-14
相关资源
最近更新 更多