我的要求很简单,我通过管理控制台将所有消息发送给系统的所有注册用户,用户和消息实体的关系是:

@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);
        }
      }
  }
}


这将是更好的解决方案还是给出答案的解决方案?

最佳答案

只要有任何一条消息与日期条件匹配,就将添加整个消息列表。
将呼叫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);
    }
}

07-24 09:45
查看更多