如何使用 @ElementCollection 进行 Set<Integer> 映射?
Posted
技术标签:
【中文标题】如何使用 @ElementCollection 进行 Set<Integer> 映射?【英文标题】:How to use @ElementCollection for Set<Integer> mapping? 【发布时间】:2020-05-09 22:45:48 【问题描述】:我有 2 张桌子。 report_id
是PK。 animals_in_area
没有 PK 密钥。
我需要通过给定的report_id
和report_date
检查animal_report
中的animal_id
。
这似乎是一个简单的任务,但我能以某种方式描述animal_report
类中的一个字段Set<Integer> adimalIds
,映射到请求的区域吗?
我试过@ElementCollection
+ @CollectionTable
,但它会自动将report_id
映射到area_id
,因为@Id
注释。
@ElementCollection
@CollectionTable(name = "animals_in_area", joinColumns = @JoinColumn(name = "area_id"))
@Column(name = "animal_id")
private Set<Integer> adimalIds = new HashSet<>();
我想在 DTO 中使用criteriaBuilder.isMember(animalIdRequest, adimalIds)
。
什么是经典方式?加入并获得设置?
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;
...
【问题讨论】:
【参考方案1】:您应该通过以下方式更正您的映射:
@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
表的主键列。
【讨论】:
以上是关于如何使用 @ElementCollection 进行 Set<Integer> 映射?的主要内容,如果未能解决你的问题,请参考以下文章
如何在休眠中为@ElementCollection 设置表名
如何使用 @ElementCollection 进行 Set<Integer> 映射?
是否可以通过 ElementCollection 查询 JPA 实体,其中 ElementCollection 包含给定元素集中的所有元素?
@OneToMany 和 @ElementCollection 之间的区别?
使用@ElementCollection 时出错:org.hibernate.MappingException:无法确定类型:java.util.Set,在表中:列