不保存实体的内部列表 [英] Not save inner list of entites

查看:19
本文介绍了不保存实体的内部列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆