2017-08-23 5 views
1

取り込まないことになる-表に参加マイ、 はここに私のクラスです:JPA多対多の-relationship - joinTable取り込まない

public void saveEmail(EmailDTO emailDTO) { 
    //Save to the db 
    final Email myEmail = new Email(); 
    myEmail .copyFrom(emailDTO); 
    for (Recipient recipient : myEmail.getRecipients()) { 
     recipient.getEmails().add(myEmail); 
     recipientRepository.save(recipient); 
    } 
    recipientRepository.flush(); 
    emailRepository.save(myEmail); 
    emailRepository.flush(); 
} 
:私はデータに以下の方法を保存し、私のサービスクラスで

@Entity 
@Table(name = "RECIPIENT") 
public class Recipient implements Serializable { 

    @ManyToMany(targetEntity = Email.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinTable(name = "EMAIL_RECIPIENT", joinColumns = {@JoinColumn(name = "RECIPIENT_ID", nullable = false, updatable = false)}, 
      inverseJoinColumns = {@JoinColumn(name = "EMAIL_ID", nullable = false)}) 
    @Fetch(FetchMode.SELECT) 
private Set<Email> emails; 

} 

@Entity 
@Table(name = "EMAIL") 
public class Email implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "EMAIL_ID") 
    private Integer emailId; 

    @ManyToMany(targetEntity = Recipient.class, mappedBy = "emails") 
    private Set<Recipient> recipients; 

} 

今私の参加するテーブルは次のようになります。

Email-ID  Recipient_ID 
67891   [email protected] 

それだけでupdate..theはトンに参加しませんことは、次のようになります。私はそれがupdate..Iを行いません間違っていた

Email-ID  Recipient_ID 
12343   [email protected] 
54678   [email protected] 
67891   [email protected] 

EDIT

であれば、それは例えば挿入された行のfrom.beforeを削除し、ログファイルで見ましたその後、

Email-ID : 1234 , 
Recipient_ID:[email protected] 

それだけで、この行を削除するなど、新たな電子メールIDを追加します:参加-の表は、このような行が存在することになる

Email-ID : 5678 Recipient_ID:[email protected] 

これはログにある、最初のそれは削除:

delete from email_recipient where recipient_id=? and email_id=? 

をそれから挿入:

insert into email_recipient (recipient_id, email_id) values (?, ?) 

答えて

1

これは、関係のそれぞれの側が他方の側への参照を持つべきである意味する双方向の関係でありますレシピエントのリストを持つ電子メールに加えて、各レシピエントには電子メールのリストが必要です。レシピエント内の電子メールリストを初期化することをお勧めします。

@Entity 
@Table(name = "RECIPIENT") 
public class Recipient implements Serializable { 

@ManyToMany(targetEntity = Email.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinTable(name = "EMAIL_RECIPIENT", joinColumns = {@JoinColumn(name = "RECIPIENT_ID", nullable = false, updatable = false)}, 
     inverseJoinColumns = {@JoinColumn(name = "EMAIL_ID", nullable = false)}) 
@Fetch(FetchMode.SELECT) 
private List<Email> emails = new ArrayList<>() 
...getter setters 
} 
Recipent繰り返し処理を行う場合、

は今

List<Recipient> recipientList = new ArrayList<Recipient>(email.getRecipients()); 
email.setRecipients(new ArrayList<Recipient>()); 
for (Recipient recipient : recipientList) { 
     recipient.getEmails().add(email); 
      email.getRecipients().add(email); 
     Recipient persistedRecipient = recipientRepository.save(recipient); 

     email = persistedRecipient.getEmails().get(persistedRecipient.getEmails().size()-1);//get the managed email 
    } 

各recipentのための電子メールのリストに電子メールを追加する別のアプローチは、同じことをやって(受信者に電子メールを追加)し、電子メールであることをカスケードを変更することになると電子メールを保存する。

@Entity 
@Table(name = "RECIPIENT") 
public class Recipient implements Serializable { 

@ManyToMany(targetEntity = Email.class) 
@JoinTable(name = "EMAIL_RECIPIENT", joinColumns = {@JoinColumn(name = "RECIPIENT_ID", nullable = false, updatable = false)}, 
     inverseJoinColumns = {@JoinColumn(name = "EMAIL_ID", nullable = false)}) 
@Fetch(FetchMode.SELECT) 
private Set<Email> emails = new HashSet<>(); 

} 

@Entity 
@Table(name = "EMAIL") 
public class Email implements Serializable { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name = "EMAIL_ID") 
private Integer emailId; 

@ManyToMany(targetEntity = Recipient.class, mappedBy = "emails"وcascade = CascadeType.ALL) 
private Set<Recipient> recipients = new HashSet<>(); 

} 

そして、あなたのsaveEmail方法

public void saveEmail(EmailDTO emailDTO) { 
//Save to the db 
final Email myEmail = new Email(); 
myEmail .copyFrom(emailDTO); 
for (Recipient recipient : myEmail.getRecipients()) { 
    recipient.getEmails().add(myEmail); 

} 

emailRepository.save(myEmail); 

}

+0

に私は(私の質問をeditet)、しかし私はNorbert94 @同じ結果 – Norbert94

+0

を得ることをやったANSERを再確認してください、あなたが取得逃しましたループ内で管理された電子メール –

+0

私はHashSetを使用しているので、私は電子メールを受け取ることができません(私は質問を更新しました) – Norbert94

関連する問題