首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >添加具有@OneToMany和@ManyToOne关系的实体

添加具有@OneToMany和@ManyToOne关系的实体
EN

Stack Overflow用户
提问于 2018-05-31 17:56:48
回答 1查看 48关注 0票数 1

我有两个实体

代码语言:javascript
复制
@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

代码语言:javascript
复制
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发送到我的控制器

代码语言:javascript
复制
@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);
}

如果没有注释代码,PersonNumber确实会保存到数据库中,但是在Number中对所有者的引用是null

在发送给控制器之前,当我这样做时,我是否必须在控制器中的每个Number对象中手动设置对owner的引用?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-05-31 20:26:11

在您已经发布的示例中,Number是一对多关系的所有者(没有mappedBy属性的实体是所有者)。只有在拥有实体上设置了对另一个对象的引用时,实体之间的关系才由JPA持久化。

这也意味着您不必将所有Number对象添加到person.numbers列表中。下面的代码也将能够持久化关系。

代码语言:javascript
复制
    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不是该关系的所有者

代码语言:javascript
复制
    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的更多详细信息,请查看此答案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50621544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档