JPA 2中的OneToMany关系

时间:2014-07-21 13:57:52

标签: jpa jpa-2.0 one-to-many

我一直在学习JPA 2,并且已经了解了OneToMany和ManyToOne的关系。这是我的标准。

  1. 有两个实体,员工和反馈。
  2. 员工可以收到多个反馈。即反馈和员工之间存在ManyToOne关系。这个我已经实现了。
  3. 但员工也可以为多名员工撰写多个反馈。这就是我被卡住的地方。
  4. 我按照以下方式构建了员工与反馈的关系。

    在反馈课程中

        @ManyToOne
    @JoinColumn(name="idEmployee")
    private Employee employee;
    

    并在Employee类中,

    @OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Feedback> feedbacks = new ArrayList<Feedback>();
    

    现在我可以检索为员工收到的所有反馈。但员工也可以向其他员工提供反馈。我怎样才能实现这种关系?

    我需要使用地图关系吗?如果是,那为什么呢?

3 个答案:

答案 0 :(得分:2)

正如我所理解的那样,两个表之间存在多对多的关系。 您应该使用@ManyToMany进行批注或使用桥接表,以便桥接表与FeedBack具有多对一关系,并与Employee具有多对一关系。 我宁愿第二种方法,因为这尊重数据库设计的NF3。

http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

http://en.wikipedia.org/wiki/Third_normal_form

答案 1 :(得分:2)

您需要另一个OneToMany关系:确保db表中的两列代表Feedbackauthorreceivee:它们将指向employee表的主键,因此它们必须具有相同的类型。添加外键约束:它们都应指向employee表的主键。然后,按照zbigniew的答案中的说明映射Java中的关系:

反馈类:

@ManyToOne
@JoinColumn(name="author")
private Employee author;

@ManyToOne
@JoinColumn(name="receivee")
private Employee receivee;

员工班级:

@OneToMany(mappedBy = "author", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Feedback> givenFeedbacks;
@OneToMany(mappedBy = "receivee", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Feedback> receivedFeedbacks;

答案 2 :(得分:1)

从反馈与两种类型的员工相关联的事实开始分析 - 一个是反馈的作者,另一个是收到反馈。之后,所有人都像这样建立起来。

@Entity
class Feedback {
    // id etc ...

    @ManyToOne
    Employee author;

    @ManyToOne
    Employee receivee;
}

@Entity
class Employee {
    // id etc ...

    @OneToMany(mappedBy="author")
    List<Feedback> feedbackGiven;

    @OneToMany(mappedBy="receivee")
    List<Feedback> feedbackReceived; 
}