我是ORM的新手,任何人都可以提出一个想法来解决以下问题。
我的聊天课程如下:
@Entity
public class Chat {
@Id
@GeneratedValue
@Column(name="Id")
private int id;
@ManyToOne
private User userSent;
@ManyToOne
private User userRecieve;
private Date time;
@Column(name="message", length=50)
private String message;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
用户类如下:
@Entity
public class User {
@Id
@GeneratedValue
private Integer id;
private String name;
private String email;
private String password;
@OneToMany
private List<Chat> chats;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public List<Chat> getChats() {
return chats;
}
public void setChats(List<Chat> chats) {
this.chats = chats;
}
}
我的问题是用户有很多聊天,聊天有两种不同类型的用户作为收件人和发件人,但他们都属于一个特定的聊天。
我的问题是如何宣布如何建立关系。提前谢谢
答案 0 :(得分:0)
无法以简单的方式表达与JPA的双向两对多关系(其中两个两个是不同的字段)。
解决此问题的最简单方法是通过从chats
中删除User
字段来使关系成为单向关系。然后在Chat
的存储库/ DAO中,提供一个函数findByUser
,其中包含
SELECT Chat c WHERE c.userSent = :user OR c.userReceive = :user
通过这种方式,您仍然可以获取给定用户的聊天集,而不是通过User
实体本身。
另一个解决方案是将关系设置为多对,并在关系中添加属性,以指示用户参与聊天的类型。您必须创建一个像
这样的中间实体@Entity
public class ChatParticipation {
public static enum Type {
SENDER,
RECEIVER
}
private Chat chat;
private User user;
private Type type;
}
并修改其他实体&#39;吸气剂
@Entity
public class Chat {
@OneToMany
private Set<ChatParticipation> participations;
public User getSender() {
return participations.stream()
.filter(p -> p.getType() == ChatParticipation.Type.SENDER)
.map(ChatParticipation::getUser)
.findFirst().get();
}
public User getReceiver() {
return participations.stream()
.filter(p -> p.getType() == ChatParticipation.Type.RECEIVER)
.map(ChatParticipation::getUser)
.findFirst().get();
}
}
@Entity
public class User {
@OneToMany
private Set<ChatParticipation> participations;
public Set<Chat> getChats() {
return participations.stream()
.map(ChatParticipation::getChat)
.collect(Collectors.toSet());
}
}
您应该缓存getter结果。此外,您必须为安装人员提供解决方案。