我的要求非常简单,我管理员通过该管理员向所有注册用户发送消息,系统,用户和消息实体的关系是:
@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);
}
}
}
}
这会是一个更好的解决方案还是给出答案的解决方案?
答案 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);
}
}