2016-05-19 5 views
1

Meine Forderungen gewünscht ist ganz einfach , ich Admin-Panel habe durch die Admin-Nachrichten an alle registrierten Benutzer des Systems sendet, Benutzer und Message Entity Beziehung ist:Wie diese Messaging-System Arbeit machen, wie

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

Und:

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

an dieser Stelle möchte ich, dass, wenn ein neuer Benutzer Zeichen-up im System sollte er nur die Admin-Nachrichten gesendet sehen, die nach seiner Anmelde-Zeit gesendet werden. Ich habe versucht:

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

Aber diese Methode funktioniert nicht wie gewünscht, bedeutet das, alle Nachrichten in Nachrichten Entity fügt hinzu, auch wenn diese vor User Anmeldedatum gesendet werden.

Wie kann ich das machen, um den gewünschten Job zu bekommen?

UPDATE

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

Wäre dies eine bessere Lösung oder diejenige sein, die in Antwort gegeben wird?

Antwort

1

Sie fügen die gesamte Nachrichtenliste hinzu, wenn eine der Nachrichten mit der Datumsbedingung übereinstimmt. Ändern Sie den Anruf user.setMessages(messages); in einen neuen, den Sie in der Benutzerklasse erstellen müssen (addMessage), der die Nachricht einfach zur Liste der Benutzernachrichten hinzufügt. (Sie können den Benutzer auch nur einmal am Ende der Schleife speichern, nicht in jeder Iteration).

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

In Ihrem Benutzerklasse etwas wie hinzufügen:

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

UPDATE

ich weiß nicht alle Details, aber wie die Nachricht mit dem aktuellen Datum wird erstellt, Ich würde erwarten, dass es ALLEN bestehenden Benutzern hinzugefügt werden muss (die vorher schon registriert sein sollten).

Also .... Ich würde die Methode so lassen: (speichern Sie die Nachricht und fügen Sie sie zu allen Benutzern hinzu).

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); 
    } 
} 
+0

Vielen Dank für Ihre Zeit, bitte sehen Sie die _UPDATE_ in meiner Frage und schlagen Sie mir die richtige Lösung! –

+1

mit einem anderen Ansatz aktualisiert – richardtz

+0

Das ist genial wirklich froh, dass diese _update_ funktioniert wie Charme, So glücklich, übrigens vielen Dank! –

Verwandte Themen