2017-06-09 3 views
0

Also habe ich zwei Entitäten:Aktualisieren einer Eins-zu-viele-Beziehung nach dem Kind gegeben

Person.java

@Entity 
@Table(name = "persons") 
public class Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @OneToMany(mappedBy="person", cascade = CascadeType.REMOVE) 
    @JsonIgnoreProperties("person") 
    private Set<Address> addresses; 

    //getters and setters 

} 

Address.java

@Entity 
@Table(name = "addresses") 
public class Address { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @NotNull 
    @ManyToOne 
    @JoinColumn(name = "person_id", nullable = false) 
    @JsonIgnoreProperties("addresses") 
    private Person person; 
    //getters and setters  
} 

Und später in meinem Code habe ich ein personDb Objekt (bereits in der Datenbank gespeichert) und dann füge ich Adresse hinzu:

Address address = new Address(); 
address.setPerson(personDb); 
address = addressRepository.save(address); 

und jetzt habe ich Adresse Objekt mit Person Objekt daran angeschlossen, aber meine PersonDb hat noch keine Adressen an sie angeschlossen. Auch wenn ich versuche, es wieder aus der Datenbank zu bekommen:

personRepository.findOne (personDb.getId());

Ich habe Null, wo Adressen gesetzt werden sollen. Ich habe auch versucht, meine Anmerkung in Person-Klasse zu so etwas wie dies zu ändern:

@OneToMany(mappedBy="person", fetch = FetchType.EAGER, cascade = CascadeType.REMOVE) 

oder Ändern CascadeType für alle, aber nichts hilft. Was kann ich tun, um Adressen in mein personDb-Objekt zu laden, nachdem sie zur Datenbank hinzugefügt wurden?

Antwort

0

Dies ist nicht die beste Lösung, aber versuchen Sie auch neue Adresse zu PersonDB hinzufügen.

Address address = new Address(); 
address.setPerson(personDb); 
personDB.addAddress(address); 
personRepo.save(personDB) 
0

Sicherstellen, dass die Person persistent ist.

Dafür machen Sie einen Integrationstest dafür. Wenn Sie Spring verwenden, schlage ich auch vor, dass Sie In-Memory-DB für Ihre Tests verwenden.

@Transactional 
@Test 
public void testFindOneAddress(){ 

// persist the person 
Person person = new Person(); 
... 
personRepository.save(person); 

// persist the address 
Address address = new Address(); 
address.setPerson(person); 
addressRepository.save(address); 

// find the persisted person and addresses 
Person queryResult= personRepository.findOne(person.getId()); 
assertNotNull(queryResult); 
assertNotNull(queryResult.getAddresses()); 
assertEquals(1, queryResult.getAddresses().size()); 
assertEquals(address.getId(), queryResult.getAddresses().get(0).getId()); 

} 

Auch stellen Sie sicher, dass Person id Spalte genannt wird "person_id"

public class Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "person_id") 
    private Integer id; 

es nehmen von dort

Verwandte Themen