Сохранять встроенные (связанные) элементы в репозиториях sping boot jpa? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть следующий «родительский класс»:

@Entity
@Table(name = "parent_table")
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long parentId;

    private String firstName;
    private String lastName;

    @OneToMany(mappedBy = "Parent", cascade = CascadeType.ALL)
    List<Child> children;
 }

У меня также есть следующий дочерний класс:

@Entity
@Table(name = "children")
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long childId;

    @ManyToOne
    @JoinColumn(name="parent_id")
    private Parent parent;

    private String name;
}

Я отправляю следующий запрос в почтальоне:

{
        "firstName": "Test",
        "lastName": "Parent",
        "children":[{
                "name":"jack"
            },
            {
                "name":"jill"
            }
        ]

}

Когда я прошу родительский репозиторий сохранить родительский файл, это происходит, но ничего не происходит с дочерним элементом ... он вообще не сохраняется в базе данных ...

Для справки, это моя строка, которая сохраняет родителя

parentRepository.save(parent)

(у родителя в этом случае два дочерних элемента внутри него, но они не сохраняются в таблице дочерних элементов).

1 Ответ

0 голосов
/ 07 марта 2019

Я запустил ваш пример, и он, кажется, работает правильно, единственное, что я изменил, было mappedBy свойство @OneToMany аннотации. Это должно быть в нижнем регистре.

  @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  List<Child> children = new ArrayList<>();

Родитель

@Entity
@Table(name = "parent_table")
public class Parent {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "parent_id")
  private Long parentId;

  private String firstName;
  private String lastName;

  @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  List<Child> children = new ArrayList<>();
}

Дети

@Entity
@Table(name = "children")
public class Child {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long childId;

  @ManyToOne
  @JoinColumn(name="parent_id")
  private Parent parent;

  private String name;

}

Тест

Приведенный выше код делает следующий блок успешным:

  @Test
  public void parentRepositoryMustPersistParentAndChildren() {
    Parent parent = new Parent("Anakin", "Skywalker");
    parent.getChildren().add(new Child("Luke"));
    parent.getChildren().add(new Child("Leia"));

    Parent saved = parentRepository.save(parent);

    Assert.assertNull("Parent does not have and id assigned after persist it", saved.getParentId());
    saved.getChildren().forEach((child) ->{
      Assert.assertNull("Parent does not have and id assigned after persist it", child.getChildId());
    });

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