[英]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.