首页 > 解决方案 > 如何使用 @ElementCollection 进行设置映射?

问题描述

我有 2 张桌子。report_id是PK。animals_in_area没有PK密钥。

我需要检查给定的和animal_id中的一个。这似乎是一个简单的任务,但我能以某种方式描述类中的一个字段,映射到请求的区域吗?我试过+ ,但由于注释,它会自动映射到。animal_reportreport_idreport_dateSet<Integer> adimalIdsanimal_report@ElementCollection@CollectionTablereport_idarea_id@Id

@ElementCollection
@CollectionTable(name = "animals_in_area", joinColumns = @JoinColumn(name = "area_id"))
@Column(name = "animal_id")
private Set<Integer> adimalIds = new HashSet<>();

我想criteriaBuilder.isMember(animalIdRequest, adimalIds)在 DTO 中使用。

经典的方法是什么?加入并获得 Set ?

               animal_report                                 animals_in_area
    ---------------------------------                      -------------------
    report_id | report_date | area_id                      area_id | animal_id  
    ---------------------------------                      -------------------
        1     |  01.01.2020 |  100                           100   |   1001
        2     |  01.01.2020 |  101                           100   |   1002
                                                             100   |   1003
                   .....                                     101   |   1002
                                                             101   |   1004

@Entity
@Table(name = "animal_report")
public class AnimalReport implements Serializable {

  @Id
  @Column(name = "report_id")
  private Long reportId;

  @Column(name = "report_date")
  private LocalDate reportDate;

  @Column(name = "area_id")
  private Integer areaId;
  ...
}

标签: javahibernatejoinone-to-manyhibernate-onetomany

解决方案


您应该通过以下方式更正您的映射:

@Entity
@Table(name = "animal_report")
public class AnimalReport implements Serializable {

  @ElementCollection
  @CollectionTable(name = "animals_in_area", joinColumns = @JoinColumn(name = "area_id", referencedColumnName = "area_id"))
  @Column(name = "animal_id")
  private Set<Integer> animalIds = new HashSet<>();

  // ...
}

您必须使用该列,referencedColumnName因为该animals_in_area.area_id列引用的不是表的主键列animal_report


推荐阅读