我的要求很简单,我通过管理控制台将所有消息发送给系统的所有注册用户,用户和消息实体的关系是:
@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);
}
}