【问题标题】:Hibernate Mapping - How to Join Three Tables [duplicate]Hibernate 映射 - 如何连接三个表 [重复]
【发布时间】:2016-05-25 06:57:18
【问题描述】:

我有 3 个实体:PERSON、CAR 和 PROFFESION。

    @Entity
    @Table(name = "PERSON")
    public class Person implements Serializable {

        @Id
        private Long id;

        @OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
        private List<Car> cars;

        @OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
        private List<Profession> professions;
    }
    @Entity
    @Table(name = "PROFESSION")
    public class Profession implements Serializable {

        @Id
        private Long id;

        @ManyToOne
        @JoinColumn(name = "PERSON_ID")
        private Person person;
    }
    @Entity
    @Table(name = "CAR")
    public class Car implements Serializable {

        @Id
        private Long id;

        @ManyToOne
        @JoinColumn(name = "PERSON_ID")
        private Person person;
    }

当我试图检索与两个职业和一辆车有联系的人时,结果是两个职业和两辆重复的汽车。

或者如果他连接了五辆车和一个职业,结果是五辆车和五个重复职业。

我应该如何更正映射以便获得正确的结果?

【问题讨论】:

  • 最简单的选项。移除 Eager fetch 或将 List 更改为 Set。
  • 你如何检索Person
  • 谢谢,我用 Set 替换了 List 并且它起作用了。是的,我使用 JPA。
  • @VakoBeridze 有趣的是,使用Hibernate(不使用JPA)你根本无法使用List 获得Person,原因是MultipleBagFetchException :)跨度>

标签: java hibernate jpa hibernate-mapping hibernate-annotations


【解决方案1】:

如果您不想重复,请使用Set 映射 oneToMany。它与映射表中的&lt;set&gt; 元素映射。所以首先你对这些部分进行更改:

private Set<Car> car = new HashSet<Car>(0);

@OneToMany(fetch=FetchType.LAZY, mappedBy="persons")
    public Set<Car> getCar() {
        return this.car;
 }
public void setCar(Set<Car> car) {
        this.car = car;
    }

对职业和另一个你不想重复的 oneToMany 做同样的事情。您可以根据加载首选项设置 fetchType。 Eager 一次性加载,Lazy 按需加载,这通常是最好的。

【讨论】:

  • 谢谢,我用 Set 替换了 List,它成功了。但我认为这是解决代码级别的问题。我将如何在数据库级别修复它?
  • @VakoBeridze 因为SQL 中的left outer join 而重复。您可以通过使用子选择(使用JPQL)来更改此行为,但可能会损失一些性能。
  • @v.ladynev 好的。非常感谢。
  • @VakoBeridze 不客气
猜你喜欢
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
相关资源
最近更新 更多