2017-06-09 23 views
0

を添加し、だから私は2つのエンティティがあります。更新1対多の関係は

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  
} 

以降私のコードで私はpersonDbオブジェクト(すでにデータベースに保存されている)を持っています。そして、私は住所を追加します:

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

私はpersonオブジェクトに接続されたアドレスオブジェクトを持っていますが、私のpersonDbにはまだアドレスがありません。もう一度データベースから取得しようとしても:

personRepository.findOne(personDb.getId());

私はどこにアドレスを設定する必要がありますか?また、私はこのような何かにPersonクラスの私の注釈を変更してみました:ALLへ

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

またはCascadeTypeを変更するが、何も助けません。私のpersonDbオブジェクトがデータベースに追加された後、アドレスをロードするにはどうすればよいですか?

答えて

0

これは最適な解決策ではありませんが、personDBに新しいアドレスも追加しようとします。

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

人が永続していることを確認してください。

これはそのための統合テストです。 Springを使用している場合は、テスト用にメモリ内のdbを使用することをお勧めします。

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

} 

また、あなたは人のid列が

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

からそれを取る "PERSON_ID" と呼ばれていることを確認してください