希望

2016-05-19 14 views
1

私の要件はかなりに簡単あるとして、私はその管理者による管理パネルをしたユーザーとメッセージエンティティ関係があり、システムのすべての登録ユーザーにメッセージを送信します。希望

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

しかし、この方法は、必要に応じて、それはそれらがユーザー入社日前に送信された場合でも、メッセージエンティティ内のすべてのメッセージ存在が追加されます意味機能していません。

どのようにして希望の仕事を得ることができますか?

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

が、これはより良い解決策または回答に記載されているものであろうか?

答えて

1

メッセージのいずれかが日付条件と一致する場合は、メッセージリスト全体が追加されます。 user.setMessages(messages);の呼び出しを、ユーザークラス(addMessage)で作成する必要がある新しいものに変更します。ユーザーのメッセージリストにメッセージが追加されます。 (ループの最後には、繰り返しを繰り返すごとに一度だけユーザーを保存することもできます)。あなたのUserクラスで

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

のようなものを追加:

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

UPDATE

を、私はすべての詳細を認識していないですが、メッセージは、現在の日付を使用して作成されているよう私はそれが既存のすべてのユーザー(これまでに登録されていたはずのもの)に追加する必要があると思います。

だから私はこのような方法を残したいと思います。(メッセージを保存してすべてのユーザーに追加するだけです)

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

ご質問ありがとうございます。私の質問で_UPDATE_を見て、正しい解決策をお教えください。 –

+1

は別の方法で更新されました – richardtz

+0

これは本当にうれしいです_update_魅力のように働くので、幸せ、ありがとうございます。 –

関連する問題