对象关系映射

时间:2016-08-26 06:27:36

标签: hibernate orm hibernate-onetomany

我是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;
    }
}

我的问题是用户有很多聊天,聊天有两种不同类型的用户作为收件人和发件人,但他们都属于一个特定的聊天。

我的问题是如何宣布如何建立关系。提前谢谢

1 个答案:

答案 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结果。此外,您必须为安装人员提供解决方案。