不保存实体的内部列表 [英] Not save inner list of entites
本文介绍了不保存实体的内部列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Spring Boot 2.2
Spring Boot 2.2
型号:
@Entity
public class Cart {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@JsonIgnore
private int id;
@NotNull
private String cartId;
@NotNull
private String username;
@NotNull
@DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss")
private Date created;
@DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss")
private Date updated;
@OneToMany(mappedBy = "cart", fetch = FetchType.EAGER, cascade = CascadeType.MERGE, orphanRemoval = true)
private Set<ProductEntry> productEntities = new HashSet<>();
@Override
public String toString() {
return "Cart{" +
"id = " + id +
", cartId = " + cartId +
", username = " + username +
", productEntities(" + productEntities.size() + ")\n" + productEntities +
", created = " + created +
", updated = " + updated +
'}';
}
@Entity
public class ProductEntry {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Exclude
private int id;
@NotNull
@DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss")
@Exclude
private Date created;
@DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss")
@Exclude
private Date updated;
private int quantity;
@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Product product;
@Exclude
@JsonIgnore
@ManyToOne(fetch = FetchType.LAZY)
private Orders orders;
@Exclude
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
private Cart cart;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@NotNull
private String name;
private String description;
@NotNull
@DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss")
private Date created;
@DateTimeFormat(pattern = "dd.MM.yyyy HH:mm:ss")
private Date updated;
@NotNull
private double price;
@NotNull
private String currency;
@ElementCollection
private Set<String> images;
@Exclude
@JsonIgnore
@OneToOne(mappedBy = "product", fetch = FetchType.EAGER)
private ProductEntry productEntry;
控制器:
通过以下方式将产品添加到购物车:
Add product to cart by this:
@PostMapping("/cart/product")
public Cart addProductToCart(@RequestBody Map<String, Object> payloadMap) {
logger.info("addProductToCart: payloadMap: " + payloadMap);
String userName = payloadMap.get("user_name").toString();
final String productString = payloadMap.get("product").toString();
Product product;
Object fromValue = payloadMap.get("product");
if (fromValue instanceof LinkedHashMap) {
product = new ObjectMapper().convertValue(fromValue, Product.class);
} else {
product = GsonUtil.gson.fromJson(productString, Product.class);
}
int quantity = (int) payloadMap.get("quantity");
Cart findCart = cartRepository.findByUsername(userName);
logger.info("addProductToCart: user_name = " + userName + " -> findCart:\n" + findCart);
if (findCart == null) {
Cart cart = new Cart();
cart.setCartId(UUID.randomUUID().toString());
cart.setCreated(new Date());
cart.setUsername(userName);
cart.addProduct(product, quantity);
cart = cartRepository.save(cart);
logger.info("addProductToCart: success_add_product_to_new_cart:\n" + cart);
return cart;
} else {
findCart.addProduct(product, quantity);
findCart = cartRepository.save(findCart);
logger.info("addProductToCart: success_add_product_to_exist_cart:\n" + findCart);
return findCart;
}
}
结果是:
: addProductToCart: user_name = admin@admin.com -> findCart:
null
2020-04-26 21:24:41.359 INFO 6485 --- [nio-8092-exec-1] r.o.s.e.controller.CartController : addProductToCart: success_add_product_to_new_cart:
Cart{id = 1, cartId = 69714d80-6724-403e-a8c5-17505cd8f4fb, username = admin@admin.com, productEntities(1)
[
ProductEntity{id = 0, quantity = 0, product =
Product{id = 0, name = 'My product 1', description='', created=Sun Apr 26 21:24:41 EEST 2020, updated=null, price=1.0, currency='USD', images=[url_1, url_2]}}], created = Sun Apr 26 21:24:41 EEST 2020, updated = null}
如您所见,productEntities
大小为 1.
As you can see the productEntities
size is 1.
但是在我调用这个方法之后(通过用户名获取汽车):
But after I call this method (get car by user_name):
@GetMapping("/cart")
public Cart getCart(@RequestParam(name = "user_name") String user_name) {
Cart findCart = cartRepository.findByUsername(user_name);
logger.info("getCart: user_name = " + user_name + " -> findCart:\n" + findCart);
return findCart;
}
响应结果:
2020-04-26 21:29:44.136 INFO 6485 --- [nio-8092-exec-6] r.o.s.e.controller.CartController : getCart: user_name = admin@admin.com -> findCart:
Cart{id = 1, cartId = 69714d80-6724-403e-a8c5-17505cd8f4fb, username = admin@admin.com, productEntities(0)
[], created = 2020-04-26 21:24:41.331, updated = null}
为什么productEntities"现在是空的?
推荐答案
我认为问题是 productEntities
在初始保存调用时未保存.
I think the issue is productEntities
was not saved at the initial save call.
这是因为您的 productEntities
字段中缺少 CascadeType.PERSIST
.
This is due to absence of CascadeType.PERSIST
in your productEntities
field.
将您的映射更改为此:
@OneToMany(mappedBy = "cart", fetch = FetchType.EAGER, cascade = { CascadeType.MERGE, CascadeType.PERSIST } orphanRemoval = true)
private Set<ProductEntry> productEntities = new HashSet<>();
这会奏效.
这篇关于不保存实体的内部列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文