繁体   English   中英

如何在 SpringBoot 中创建一个新的 SQL 行并将元素添加到其列表字段?

[英]How to create a new SQL row and add elements to its list field in SpringBoot?

我在 Java 和 SQL 中使用 SpringBoot 和 Hibernate 来管理我的数据库。 数据库中有两个表和对应的实体,分别称为 Order 和 Package。 一份订单可以有多个包裹。 一个 package 只能在一个订单中。 所以它是 OneToMany(订单-> 包裹)。

所以在订单 class 中有一个名为 List pckList 的字段。

在 Package class 中有一个名为 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

首先,您应该审查您的实体设计。 我很确定您不需要在每个 package 中作为实体订购。

是的,可能您需要orderId作为外键,但不需要 order。

In my practice that was a reason for cyclic SQL selects ---> you select order -- > order select packages --> each package select order again and so on. 为了解决这种行为 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

orderRepo.save(order)会将持久化的 object 返回给您。 您应该重新分配 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM