虽然我不知道你尝试了什么,但这是可能的。如果你想要双向映射,你会:
@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", cascade = CascadeType.ALL, 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;
}
这同样适用于其他表格(滑动、匹配、计时器)。您使用@JoinColumn 指定要将哪个外键映射到哪个字段。
如果您想要单向映射或其他内容,建议您查看Vlad Mihalcea 的文章The best way to map a @OneToMany relationship with JPA and Hibernate。
注意:如果您想获取包含已发送和已接收消息的配置文件,则需要使用 Criteria API(或其他方法)。如果您想尝试以下方法:
@Query("from Profile p join fetch p.sentMessages join fetch p.receivedMessages where p.id = :id")
Optional<Profile> findProfileByIdFetchSendAndReceivedMessages(int id);
或
@Override
@EntityGraph(attributePaths = { "sentMessages", "receivedMessages" })
Optional<Profile> findById(int id);
你会得到MultipleBagFetchException。
由于有很多关于这个主题的精彩文章,我现在不再赘述。比如遇到这个问题,可以查看另一个Vlad Mihalcea的文章The best way to fix the Hibernate MultipleBagFetchException。