首页 > 解决方案 > 在第二次保存时,先前保存的数据的外键在 Spring Boot 中更新为 null

问题描述

下面开发一个购物车应用程序是我的实体类......

当我第一次保存用户实体时,当使用相同的请求再次保存用户时,之前保存的外键变为空,我正在使用相同的请求,因为对于同一个用户,对于同一个购物车,购物车产品必须更新在多行中。

    @Entity
    public class CartProduct implements Serializable {

            /**
             * serialVersionUID.
             */
            private static final long serialVersionUID = 5846027470952949766L;

            /**
             * cartProdcutId.
             */
            @Id
            @GeneratedValue
            @Column(name = "CART_PRODUCT_ID")
            private Integer cartProdcutId;

            /**
             * product.
             */
            @ManyToOne
            @JoinColumn(name = "PRODUCT_ID")
            private Product product;

            /**
             * cart.
             */
            @ManyToOne
            @JoinColumn(name = "CART_ID")
            private Cart cart;

            /**
             * quantity.
             */
            @Min(value = 0, message = "Product Quantity should not be negative")
            @Column(name = "QUANTITY")
            private Integer quantity;

}

二等

    @Entity
    public class Cart {
        /**
         * cartId.
         */
        @Id
        @GeneratedValue
        @Column(name = "CART_ID")
        Integer cartId;
        /**
         * cartProducts.
         */
        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name = "CART_ID")
        Set<CartProduct> cartProducts = new HashSet<CartProduct>();
 }

保存用户类

    @Entity
    public class User {

        /**
         * userId.
         */
        @Id
        @GeneratedValue
        @Column(name = "USER_ID")
        Integer userId;
        /**
         * userName.
         */
        @Column(name = "USER_NAME")
        String userName;
        /**
         * cart.
         */
        @OneToOne(cascade = CascadeType.ALL)
        Cart cart;
}    

产品类别

    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @NamedQueries({ @NamedQuery(name = "Product.findBook", query = "SELECT p FROM Product p WHERE TYPE(p) = Book"),
            @NamedQuery(name = "Product.findApparal", query = "SELECT p FROM Product p WHERE TYPE(p) = Apparal"),
            @NamedQuery(name = "Product.findByName", query = "SELECT p FROM Product p WHERE p.productName=:name") })
    public class Product {

        /**
         * productId.
         */
        @Id
        @GeneratedValue
        @Column(name = "PRODUCT_ID")
        Integer productId;
        /**
         * productName.
         */
        @Column(name = "PRODUCT_NAME")
        String productName;
        /**
         * price.
         */
        @Column(name = "PRICE")
        Float price;
 }

保存用户的服务方法

userRepository.save(user);

邮递员中用于保存用户实体的 Json:

{
  "cart": {
    "cartId": 1,
    "products": [
      {
        "cartProdcutId": 1,
        "product": {
          "price": 100,
          "productId": 1,
          "productName": "ProdNameOne"
        },
        "quantity": 1
      }
    ]
  },
  "userId": 1,
  "userName": "USERONE"
}

下面是第一行中更新 null 的数据库屏幕截图:数据库屏幕截图

标签: spring-bootspring-data-jpaforeign-keyshibernate-mappinghibernate-onetomany

解决方案


推荐阅读