代码之家  ›  专栏  ›  技术社区  ›  Vako Beridze

休眠映射-如何连接三个表[重复]

  •  3
  • Vako Beridze  · 技术社区  · 10 年前

    我有3个实体:个人、汽车和职业。

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

    当我试图找回一个与两种职业和一辆车有联系的人时,结果是两种职业两辆复制的车。

    或者,如果他与五辆车和一个职业相关联,结果是五辆车,五个重复的职业。

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

    1 回复  |  直到 10 年前
        1
  •  2
  •   luffy    10 年前

    使用 Set 将一个映射到多个如果不需要重复项。它映射为 <set> 映射表中的元素。因此,首先要对这些部分进行更改:

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

    对专业和另一个做同样的事。很多人都不想重复。您可以根据加载首选项设置fetchType。 Eager 一次加载所有内容 Lazy 按需加载通常是最好的。