如何解决Spring Data JPA 从主键作为外键的多个一对多关系
我正在研究类似 tinder 的 Spring Boot 和 Angular Web 应用程序,但坚持在 JPA 中建立关系(我已经在 pgAdmin 中的 postgresql 数据库中建立了关系) 我尝试了@OnetoMany、@JoinColumns 和其他方法,但不知道如何制作它以及是否可以建立这样的关系,因为我没有在任何网站上找到这样的例子(当然包括 Stackoverflow)
-
id:id
-
决定:是/否
-
swipeFrom: 发送喜欢的个人资料的 id (profiles.id)
-
swipeto:获得喜欢的个人资料的 id (profiles.id)
-
时间戳:时间戳
在所有其他表中,它会像上面一样工作
这样的关系可能吗? 如果没有,我该怎么办?也许只是保持原样,然后在删除父项时在方法中手动删除匹配项、滑动项等?
解决方法
虽然我不知道你尝试过什么,但这是可能的。如果你想要双向映射,你会:
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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。