【问题标题】:OneToMany relationship in JPA 2JPA 2 中的 OneToMany 关系
【发布时间】:2014-07-21 13:57:52
【问题描述】:

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

  1. 有两个实体,员工和反馈。
  2. 员工可以收到多个反馈。即反馈和员工之间存在多对一关系。这是我实现的。
  3. 但员工也可以为多个员工编写多个反馈。这就是我卡住的地方。

我已经建立了员工与反馈的关系,如下所示。

在反馈课中

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

在 Employee 类中,

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

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

我需要使用映射关系吗?如果是,那为什么?

【问题讨论】:

  • 所以,每个反馈都有一个创建它的员工和一个接收它的员工,不是吗?
  • @perissf,没错。员工可以创建多个反馈。但只有一个特定员工的反馈。

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


【解决方案1】:

您需要另一个 OneToMany 关系:确保 db 表中有两列代表 Feedback:author 和 receivee:它们将指向员工表的主键,因此它们必须具有相同的那样输入。添加外键约束:它们都应该指向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】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 谢谢您的想法,先生。我已经尝试过这个,并通过使用 EAGER 关系调用 fetched 。它遇到异常说无法完成多个急切获取。
    • 另外,Feedback 表不是有两列,它们是 Employee 类中同一列的外键吗?
    • 是的,反馈应该有两个给员工的 FK。并且渴望加入应该不是问题。您在反馈中只有对员工的 FK 并且无法更改?如果是这样的话,那你就有点卡住了。使用 Map 您必须在 Employee 和 Feedback 之间建立一个连接表。你在考虑加入表吗?最重要的是您需要在某处存储有关关系类型 (FeedbackeeType={GIVEN,RECEIVED}) 的信息。它可以在哪里,这取决于您在设计中的限制。我刚刚为您的案例发布了恕我直言的最佳设计。
    • 设计不是限制,因为我只是在为自己学习。如果要将信息放在另一个表中,那么我们如何访问它?我的意思是我理解这种关系,但如果我要实现你的设计,我该怎么做?你能再解释一下吗?
    • 请咨询我的另一个答案:stackoverflow.com/questions/24861892/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2010-10-27
    • 2014-07-30
    • 2019-02-10
    • 2021-02-10
    • 1970-01-01
    相关资源
    最近更新 更多