1

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

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

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?

Thanks for help.

ASF
  • 64
  • 11
Dingo
  • 331
  • 2
  • 3
  • 10

1 Answers1

0

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). Relationships between entities are persisted by JPA only if the reference to the other object is set on the owning entity.

This also means that you do not have to add all the Number objects to the person.numbers list. 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 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

Ranjith
  • 1,623
  • 3
  • 21
  • 34