Reputation: 3274
My requirement is quite straightforward, I've admin panel through that admin sends messages to all registered users of the System, User and Message Entity relationship is:
@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
}
And:
@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
}
At this point I want that when a new user signs-up in the System, he should only see the admin sent messages that are sent after his sign-up time. I've tried:
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);
}
}
}
}
But this method is not working as desired, means it adds all the messages present in Messages Entity, even if those are sent before User Joined Date.
How can I make that possible to get desired job don?
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);
}
}
}
}
Would this be a better solution or the one which is given in answer?
Upvotes: 1
Views: 48
Reputation: 4993
You are adding the whole messages list whenever any of the messages matches the date condition.
Change the call user.setMessages(messages);
to a new one you need to create in the User class (addMessage
) which simply adds the message to the user messages list. (You can also save the user only once at the end of the loop, not in every iteration).
for (Message savedMessage : messages) {
if(user.getUserJoinedAt().before(savedMessage.getMessageSentDate())){
user.addMessage(savedMessage);
}
}
userService.save(user);
In your User class add something like :
public void addMesage(Message msg) {
messages.add(msg);
}
UPDATE
I am not aware of all the details, but as the message is being created with the current date, I'd expect it will need to be added to ALL existing users (which should have been registered before now).
So .... I'd leave the method like this : (just save the message and add it to all the users).
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);
}
}
Upvotes: 1