2017-03-24 1 views
2

Werte Ich habe den folgenden Code:Frühling JPA schafft Einheit mit 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(); 
} 

Als ich dies ausführen, die neue UserFormGroups haben eine ID und alle anderen Felder sind null. Ist etwas nicht in Ordnung, wenn Sie eine ManyToOne-Beziehung vollständig aktualisieren?

Auf der Konzernunternehmen ich folgende OneToMany Beziehung haben:

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

Und die UserFormGroup Beziehung sieht wie folgt aus:

@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

ist GroupRepository ein JpaRepository? Und um es klar zu stellen, die UserFormGroup-Entitäten werden erstellt, aber nur mit der ID und dem Fremdschlüssel für das GroupModel? –

+0

Ähnlich wie ein Feder Data Repository erweitert es CrudRepository. Sie werden erstellt, aber nur die ID wird festgelegt, die Rolle ist null, form_group ist null und der Benutzer ist null. – Servietsky

Antwort

1

nicht zu 100%, aber das Problem nach meiner Meinung nach könnte:

Die CrudRepository-Implementierungen save Methode überprüft, ob das Objekt, das Sie speichern, eine neue oder vorhandene Entität ist. Wenn es bereits existiert, führt es eine merge Operation aus. Dies wäre das Szenario, das in Ihrem Fall passiert, da die groupModel eine bestehende Entität ist.

nun auf der @OneToMany Abhängigkeit haben Sie nur diese Kaskade Optionen:

cascade = { CascadeType.PERSIST, CascadeType.REMOVE }

Wenn Sie CascadeType.MERGE die Operation hinzufügen sollte die UserFromGroup Einheiten vermehrt werden und sie (das Standardverhalten von merge bestehen bleiben, wenn die Entitäten sind neue).

+0

Dies scheint zu funktionieren, aber ich habe den folgenden Fehler 'Eintrag' 1-8 'für Schlüssel verdoppeln, wenn ich eine UserFormGroup hinzufügen, die bereits in der FormGroup war. Wahrscheinlich, weil die verwaiste Person gelöscht wird, nachdem die neue erstellt wurde – Servietsky

+0

Es wurde behoben, indem die UserFormGroup abgerufen wurde, wenn sie bereits existiert, und sie erstellt wurde, wenn dies nicht der Fall ist. Danke – Servietsky

+0

Ok toll. Schön, dass es für dich geklappt hat –