简体   繁体   中英

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

I am using SpringBoot and Hibernate in Java, and SQL to manage my database. There are two tables and corresponding entities in the database called Order and Package. One order can have many packages. And one package can be only in one order. So it's OneToMany (Order->Package).

So in Order class there is a field called List pckList.

In Package class there is a field called Order order.

Now, I receive a list newPackageList of packages from the user. I need to create a brand new order and then add all the given packages into this newly created order. I tried doing something like this:

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

First of all you should review you entities design. I'm pretty sure you don't need order inside your each package as entity.

Yes,may be you need orderId as a foreign key, but not 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. For resolve this behavior Hibernate has some hacks but just don't)

So I suggest you:

@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

}

To save, you need to:

Order order = new Order;

order.setPackages(newPackageList)

orderRepo.save(order); // method from JPA CrudRepoposiry

orderRepo.save(order) will return the persisted object back to you. You should reassign the order variable to point to the returned instance:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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