簡體   English   中英

使用@OneToMany和@ManyToOne關系添加實體

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

我有兩個實體

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

沒有注釋的代碼, PersonNumber確實會保存到數據庫中,但是Number對owner的引用為null

在發送給控制器之前,是否必須在控制器中的每個Number對象中手動設置對所有者的引用?

感謝幫助。

在您發布的示例中-Number是一對多關系的所有者(不具有mappingBy屬性的實體是所有者)。 只有在擁有實體上設置了對另一個對象的引用時,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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM