如何使此消息传递系统按预期工作

时间:2016-05-19 14:32:24

标签: java spring-mvc

我的要求非常简单,我管理员通过该管理员向所有注册用户发送消息,系统,用户和消息实体的关系是:

@Entity
    public class Message implements Serializable {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int id;
        private String message;
        @Temporal(TemporalType.TIMESTAMP)
        private Date sentDate;

        @ManyToMany(mappedBy = "messages", cascade = {CascadeType.MERGE})           
        private List<User> users;
        // setter - getters methods are omitted
    } 

@Entity
public class User implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long userId;
    private String userName;
    @Temporal(TemporalType.TIMESTAMP)
    private Date userJoinedAt;
    @ManyToMany(cascade = { CascadeType.PERSIST })
    @JoinTable          
    private List<Message> messages;
    // setter - getters methods are omitted
    } 

此时我希望当新用户在系统中注册时,他应该只看到管理员发送的消息,这些消息是在他的注册时间之后发送的。我试过了:

public void addMessage(Message message) throws Exception {        
  message.setMessageSentDate(new Date());
  messageService.save(message);
  List<Message> messages = messageService.getAll();               
  List<User> registeredUsers = userService.getAll();
  for (User user : registeredUsers) {
      for (Message savedMessage : messages) {
        if(user.getUserJoinedAt().before(savedMessage.getMessageSentDate())){
            user.setMessages(messages);
            userService.save(user);
        }
      }
  }
}

但是此方法无法正常工作,意味着它会添加消息实体中存在的所有消息,即使这些消息是在用户加入日期之前发送的。

如何才能让所需的工作成为可能?

更新

public void addMessage(Message message) throws Exception {        
  message.setMessageSentDate(new Date());
  messageService.save(message);
  List<Message> messages = messageService.getAll();               
  List<User> registeredUsers = userService.getAll();
  for (User user : registeredUsers) {
    // Initializing new variable to store afterJoinedMessages
    List<Message> afterJoinedMessages = new CopyOnWriteArrayList<Message>();
      for (Message savedMessage : messages) {
        if(user.getUserJoinedAt().before(savedMessage.getMessageSentDate())){
            // Here adding those messages to afterJoinedMessages List
            afterJoinedMessags.add(savedMessage);
            // and saving those to user
            user.setMessages(afterJoinedMessags);
            userService.save(user);
        }
      }
  }
}

这会是一个更好的解决方案还是给出答案的解决方案?

1 个答案:

答案 0 :(得分:1)

只要任何消息与日期条件匹配,您就会添加整个消息列表。 将呼叫user.setMessages(messages);更改为您需要在User类(addMessage)中创建的新呼叫,该呼叫只是将消息添加到用户消息列表中。 (您也可以在循环结束时仅保存用户一次,而不是在每次迭代中保存。)

for (Message savedMessage : messages) {
    if(user.getUserJoinedAt().before(savedMessage.getMessageSentDate())){
        user.addMessage(savedMessage);
    }
}
userService.save(user);

在您的User类中添加如下内容:

public void addMesage(Message msg) {
    messages.add(msg);
}

<强>更新

我不知道所有细节,但由于正在使用当前日期创建消息,我希望它需要添加到所有现有用户(之前应该已经注册)。

所以......我会像这样离开这个方法:(只需保存邮件并将其添加到所有用户)。

public void addMessage(Message message) throws Exception {        
    message.setMessageSentDate(new Date());
    messageService.save(message);
    List<User> registeredUsers = userService.getAll();
    for (User user : registeredUsers) {
        user.addMessage(message);
        userService.save(user);
    }
}