Spring Data JPA 从主键作为外键的多个一对多关系

问题描述

我正在研究类似 tinder 的 Spring Boot 和 Angular Web 应用程序,但坚持在 JPA 中建立关系(我已经在 pgAdmin 中的 postgresql 数据库中建立了关系) 我尝试了@OnetoMany、@JoinColumns 和其他方法,但不知道如何制作它以及是否可以建立这样的关系,因为我没有在任何网站上找到这样的例子(当然包括 Stackoverflow)

一个人向右滑动时,另一个人的应用程序将插入到滑动中

  • id:id

  • 决定:是/否

  • swipeFrom: 发送喜欢的个人资料的 id (profiles.id)

  • swipeto:获得喜欢的个人资料的 id (profiles.id)

  • 时间戳:时间戳

在所有其他表中,它会像上面一样工作

这样的关系可能吗? 如果没有,我该怎么办?也许只是保持原样,然后在删除父项时在方法中手动删除匹配项、滑动项等?

enter image description here

解决方法

虽然我不知道你尝试过什么,但这是可能的。如果你想要双向映射,你会:

select b.field1,b.field2,b.field3,b.blob1,b.blob2
from (
  select distinct field1,field2,field3,hash(blob1) as hash1,hash(blob2) as hash2
  from table1
) a
inner join table1 b
  on b.field1 = a.field1 and b.field2 = a.field2 and b.field3 = a.field3
    and hash(b.blob1) = a.hash1 and hash(b.blob2) = a.hash2

这同样适用于其他表格(滑动、匹配、计时器)。您可以使用 @Entity @Table(name = "profiles") public class Profile { // other fields @OneToMany(mappedBy = "sender",cascade = CascadeType.ALL,orphanRemoval = true) private List<Message> sentMessages = new ArrayList<>(); @OneToMany(mappedBy = "receiver",orphanRemoval = true) private List<Message> receivedMessages = new ArrayList<>(); // other collections for swipes,matches and timers } @Entity @Table(name = "messages") public class Message { // other fields @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "message_from") private Profile sender; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "message_to") private Profile receiver; } 指定要将哪个外键映射到哪个字段。

如果您想要单向映射或其他东西,我建议您查看Vlad Mihalcea 的文章The best way to map a @OneToMany relationship with JPA and Hibernate


注意:如果您想获取包含已发送和已接收消息的个人资料,则需要使用 Criteria API(或其他一些方法)。如果你想尝试类似的东西:

@JoinColumn

@Query("from Profile p join fetch p.sentMessages join fetch p.receivedMessages where p.id = :id")
Optional<Profile> findProfileByIdFetchSendAndReceivedMessages(int id);

你会得到 MultipleBagFetchException

由于这个主题有很多很棒的文章,我现在不详细介绍。例如,如果您遇到此问题,您可以查看另一个 Vlad Mihalcea 的文章 The best way to fix the Hibernate MultipleBagFetchException