2017-03-24 12 views
2

値Iは、次のコードをしている:私はこれを実行すると、新しいUserFormGroupsは、IDを春JPAがnullでエンティティを作成するには

groupModel.getUserFormGroups().clear(); 
for(MemberDTO member : group.getMembers()){ 
    User u = userRepository.findByEmail(member.getEmail()); 
    System.out.println(member.getEmail() + " " + groupModel.getName() + " " + member.getRole()); 
    if(u == null){ 
     return new ResponseEntity<>(HttpStatus.BAD_REQUEST); 
    } 
    groupModel.getUserFormGroups().add(new UserFormGroup(u, groupModel, UserFormGroupRole.ADMIN)); 
} 

try{ 
    groupRepository.save(groupModel); 
    return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); 
} catch (DataIntegrityViolationException e){ 
    System.out.println(e.getMessage()); 
    System.out.println(e.getClass()); 
    return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).build(); 
} 

持っており、他のすべてのフィールドがNULLです。 ManyToOne関係を完全に更新することに何か問題はありますか?私は、次のOneToMany関係したグループのエンティティで

@OneToMany(targetEntity=UserFormGroup.class, cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.EAGER, mappedBy = "formGroup", orphanRemoval=true) 
private Set<UserFormGroup> userFormGroups = new HashSet<>(); 

そしてUserFormGroup関係は次のようになります。

@Entity 
@Table(uniqueConstraints={ 
     @UniqueConstraint(columnNames = {"user", "form_group"}) 
}) 
public class UserFormGroup implements Serializable{ 

    @Id 
    @GeneratedValue(strategy= GenerationType.AUTO) 
    private long id; 

    @ManyToOne 
    @JoinColumn(name = "user",referencedColumnName = "id") 
    private User user; 

    @ManyToOne 
    @JoinColumn(name = "form_group", referencedColumnName = "id") 
    private FormGroup formGroup; 

    @Column(name = "role") 
    private UserFormGroupRole role; 

    public UserFormGroup() { 
    } 

    public UserFormGroup(User user, FormGroup group, UserFormGroupRole role) { 
     this.user = user; 
     this.formGroup = group; 
     this.role = role; 
    } 

    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    public FormGroup getFormGroup() { 
     return formGroup; 
    } 

    public void setFormGroup(FormGroup formGroup) { 
     this.formGroup = formGroup; 
    } 

    public UserFormGroupRole getRole() { 
     return role; 
    } 

    public void setRole(UserFormGroupRole role) { 
     this.role = role; 
    } 
} 
+0

はgroupRepositoryです。JpaRepository?そして、明らかに、UserFormGroupエンティティは作成されますが、GroupModelへのIDと外部キーだけで作成されますか? –

+0

もっと春のデータリポジトリに似ていますが、CrudRepositoryを拡張しています。それらは作成されますが、idのみが設定され、roleはnull、form_groupはnull、userはnullです。 – Servietsky

答えて

1

ない100%私の意見では問題は、次のことかもしれません。

CrudRepositoryの実装saveメソッドは、保存しているオブジェクトが新しいエンティティか既存のエンティティかをチェックします。すでに存在する場合は、merge操作を実行します。 groupModelが既存のエンティティであるため、これはあなたのケースで起こるシナリオです。あなたはCascadeType.MERGE操作がUserFromGroupエンティティに伝播する必要がありますを追加して(マージのデフォルトの動作を継続する場合

cascade = { CascadeType.PERSIST, CascadeType.REMOVE }

は今@OneToManyの依存関係にあなただけのこれらのカスケードのオプションを持っていますエンティティは新しいものです)。

+0

これはうまくいくようですが、すでにFormGroupに入っていたUserFormGroupを追加すると、 '重複したエントリ '1-8' key'というエラーがあります。おそらく、新しいものが作成された後に孤児が削除されたためです。 – Servietsky

+0

すでに存在する場合はUserFormGroupを取得し、存在しない場合は作成します。ありがとうございます – Servietsky

+0

大丈夫です。うれしいことはあなたのために働いた –

関連する問題