Добавление сущности с отношениями @OneToMany и @ManyToOne - PullRequest
0 голосов
/ 31 мая 2018

У меня есть две сущности

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

Без комментария кода,Person и Number сохраняются в базе данных, однако ссылка на владельца в Number равна null.

Нужно ли вручную устанавливать ссылку на владельца в каждом объекте Number контроллера, когдаЯ сделал это, прежде чем отправить его на контроллер?

Спасибо за помощь.

1 Ответ

0 голосов
/ 31 мая 2018

В приведенном вами примере - 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...