Как создать новую строку SQL и добавить элементы в ее поле списка в SpringBoot? - PullRequest
0 голосов
/ 06 августа 2020

Я использую SpringBoot и Hibernate в Java и SQL для управления своей базой данных. В базе данных есть две таблицы и соответствующие сущности, которые называются Заказ и Пакет. В одном заказе может быть много пакетов. Причем одна упаковка может быть только в одном заказе. Итак, это OneToMany (Order-> Package).

Итак, в классе Order есть поле под названием List pckList.

В классе Package есть поле под названием Order order.

Теперь я получаю от пользователя список newPackageList пакетов. Мне нужно создать новый заказ, а затем добавить все данные пакеты в этот вновь созданный заказ. Я пробовал сделать что-то вроде этого:

Order order = new Order;
orderRepo.save(order);
Long lastId = orderRepo.lastAddedId; // id of the newly added order it's auto generated. Let's assume for now I can get it
order.setId(lastId);
for (Package pck : newPackageList){
   pck.setOrder(order);
   packageRepo.save(pck);
}
packageRepo.setPackageListForOrder(lastId, newPackageList); // set the pckList property of the newly created order

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

orderRepo.save(order) вернет вам сохраненный объект. Вы должны переназначить переменную порядка, чтобы она указывала на возвращаемый экземпляр:

Order order = new Order();
order = orderRepo.save(order);
// no need to remember the id or set it
for (Package pck : newPackageList){
   pck.setOrder(order);
   packageRepo.save(pck);
}
packageRepo.setPackageListForOrder(lastId, newPackageList); // set the pckList property of the newly created order
0 голосов
/ 06 августа 2020

Прежде всего вам следует изучить дизайн ваших сущностей. Я почти уверен, что вам не нужен порядок внутри каждого вашего пакета как объекта.

Да, возможно, вам понадобится orderId в качестве внешнего ключа, но не order.

В моей практике это было причиной cycli c SQL выбирает ---> вы выбираете порядок -> порядок выбора пакетов -> каждый пакет снова выбирает порядок и так далее. Для решения этой проблемы в Hibernate есть несколько хаков, но их просто нет)

Итак, я предлагаю вам:

@Entity
@Table(name="orders")
public class Order {

  @Id
  private int id;

  private String name;

  @OneToMany(cascade = CascadeType.PERSIST) // CascadeType.PERSIST is needed so that when saving an entity, its collection is saved (or updated)
  @JoinColumn(name="order_id")
  private List<Package> packages = new ArrayList<>();

   // getters setters

}

@Entity
@Table(name="packages")
public class Package {

  @Id
  private int id;

  private String packageName;

  private int orderId; // order foreign key instead of entity

  // getters setters

}

Для сохранения вам необходимо:

Order order = new Order;

order.setPackages(newPackageList)

orderRepo.save(order); // method from JPA CrudRepoposiry
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...