我有两个实体
@Entity
public class Person{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(nullable = false)
@OneToMany(mappedBy = "owner",cascade=CascadeType.ALL)
private List<Number> numbers
//getters and setters
}
@Entity
public class Number{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@ManyToOne
@JoinColumn("owner_id")
private Person owner;
//getters and setters
}
我创建了person
Person p = new Person()
Number n1 = new Number()
Number n2 = new Number()
n1.setOwner(p)
n2.setOwnet(p)
List<Number> numbers = new ArrayList<>();
numbers.add(n1);
numbers.add(n2);
p.setNumbers(numbers)
send(p);
并将其作为JSON发送到我的控制器
@RequestMapping(value = "/add", method = RequestMethod.POST)
@ResponseBody
public void addFramework(@RequestBody List<Person> persons){
System.out.println("=============");
/*for( Persons person: persons){
for(Number n: person.getNumbers()){
n.setOwner(owner);
}
}*/
repository.saveAll(persons);
}
如果没有注释代码,Person
和Number
确实会保存到数据库中,但是在Number
中对所有者的引用是null
。
在发送给控制器之前,当我这样做时,我是否必须在控制器中的每个Number对象中手动设置对owner的引用?
谢谢你的帮助。
发布于 2018-05-31 20:26:11
在您已经发布的示例中,Number是一对多关系的所有者(没有mappedBy属性的实体是所有者)。只有在拥有实体上设置了对另一个对象的引用时,实体之间的关系才由JPA持久化。
这也意味着您不必将所有Number
对象添加到person.numbers列表中。下面的代码也将能够持久化关系。
Person p = new Person();
p.setId(1L);
Number n1 = new Number();
Number n2 = new Number();
n1.setOwner(p);
n2.setOwner(p);
personRepository.save(p);
numberRepository.save(n1);
numberRepository.save(n2);
Person retrievedPerson = personRepository.findById(1L).get();
System.out.println(retrievedPerson.getNumbers().size()); // prints 2
虽然下面的代码不会持久化关系,因为Person不是该关系的所有者
Person p = new Person();
p.setId(1);
Number n1 = new Number();
Number n2 = new Number();
List<Number> numbers = Arrays.asList(n1, n2);
p.setNumbers(numbers);
personRepository.save(p);
numberRepository.save(n1);
numberRepository.save(n2);
Person retrievedPerson = personRepository.findById(1L).get();
System.out.println(retrievedPerson.getNumbers().size()); // prints 0
有关同一- https://stackoverflow.com/a/21068644/1377058的更多详细信息,请查看此答案
https://stackoverflow.com/questions/50621544
复制相似问题