简体   繁体   English

使用@OneToMany和@ManyToOne关系添加实体

[英]Adding entity with @OneToMany and @ManyToOne relation

I have two entities 我有两个实体

@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
}

I create 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);

and send it as JSON to my controller 并将其作为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);
}

Without the commented code, Person and Number does get saved into database, however the reference to owner in Number is null . 没有注释的代码, PersonNumber确实会保存到数据库中,但是Number对owner的引用为null

Do I have to manually set reference to owner in every Number object in controller, when I did it before I send it to the controller? 在发送给控制器之前,是否必须在控制器中的每个Number对象中手动设置对所有者的引用?

Thanks for help. 感谢帮助。

In the example that you've posted - Number is the owner of the one-to-many relationship (The entity that doesn't have the mappedBy attribute is the owner). 在您发布的示例中-Number是一对多关系的所有者(不具有mappingBy属性的实体是所有者)。 Relationships between entities are persisted by JPA only if the reference to the other object is set on the owning entity. 只有在拥有实体上设置了对另一个对象的引用时,JPA才会保留实体之间的关系。

This also means that you do not have to add all the Number objects to the person.numbers list. 这也意味着您不必将所有Number对象都添加到person.numbers列表中。 The following code will also be able to persist the relationship. 以下代码也将能够保持这种关系。

    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

While the following code will not persist the relationship as Person is not the owner of the relationship 虽然以下代码将不会持久保留该关系,因为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

Check this answer for more details on the same - https://stackoverflow.com/a/21068644/1377058 检查此答案以获取更多详细信息-https://stackoverflow.com/a/21068644/1377058

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM