Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建链接在一起的OneToOne和OneToMany_Java_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

Java 如何创建链接在一起的OneToOne和OneToMany

Java 如何创建链接在一起的OneToOne和OneToMany,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我来自前端,所以所有这些对我来说都是新的。我拥有以下实体客户,购物车,产品,它们之间相互连接: 客户端@OneToOne购物车 购物车=>@OneToMany=>产品(@ManyToOne用于购物车) 运行mySpringDataJPA应用程序可以正确创建所有my 3表,其中包含Postgres中的所有列及其外键。使用所有字段创建新的购物车,将在Postgres中创建客户端和购物车,但不会创建产品,它是@ManyToOne。查询数据库将为产品 // Client @Data @AllArgsCo

我来自前端,所以所有这些对我来说都是新的。我拥有以下实体
客户
购物车
产品
,它们之间相互连接:

  • 客户端
    @OneToOne
    购物车
  • 购物车
    =>
    @OneToMany
    =>
    产品
    @ManyToOne
    用于
    购物车
  • 运行my
    SpringDataJPA应用程序
    可以正确创建所有my 3表,其中包含Postgres中的所有列及其外键。使用所有字段创建新的
    购物车
    ,将在Postgres中创建
    客户端
    购物车
    ,但不会创建
    产品
    ,它是
    @ManyToOne
    。查询数据库将为
    产品

    // Client
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    @Entity
    public class Client {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int client_id;
    
    private String name;
    private String lastName;
    
    @OneToOne(mappedBy = "client")
    private Cart cart;
    }
    
    
    // Cart
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    @Entity
    public class Cart {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int cart_id;
    
    @OneToMany(mappedBy = "cart")
    private List<Product> productList;
    
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "fk_client_id", referencedColumnName = "client_id")
        private Client client;
    }
    
    
    //Product
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ToString
    @Entity
    public class Product {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int product_id;
        private String productName;
        private int price;
        private int qty;
    
        @ManyToOne
        @JoinColumn(name = "fk_cart_id")
        private Cart cart;
    }
    
    
    // CartController
    @RestController
        public class CartController {
    
            @Autowired
            CartRepository cartRepository;
    
            @PostMapping("/createCart")
            public Cart createCart(@RequestBody Cart request) {
                return cartRepository.save(request);
            }
    }
    
    我做错了什么?为什么不填充
    产品
    表?
    
    注意:
    购物车
    产品
    之间只有
    @OneToMany
    @ManyToOne
    ,我可以同时填充这两个,但是当
    客户
    加入到组合中时,我有上面描述的问题)

    拥有实体的概念就是你所缺少的

    购物车
    实体中,您有:

    @OneToMany(mappedBy = "cart")
    private List<Product> productList;
    
    productList
    应视为仅查询字段

    请注意,您可以在
    Cart
    中使用
    Cascade
    注释玩游戏,但我不建议这样做。这是一个有点复杂和烦人的注释。不要在
    控制器
    层中有
    存储库
    ,而是创建一个
    @服务
    层,将持久化、检索和其他业务逻辑放在其中,并将其包含在控制器中。标准图案

    然后为您的服务层编写junit/mockito测试用例


    编辑:需要明确的是,
    产品
    不能持久化
    购物车
    ,而是必须具有以前持久化的
    购物车
    ,才能设置为购物车字段。对
    购物车
    实体没有这样的要求。

    你是对的,我缺少了关系所有权的一部分。您提到
    产品
    拥有该关系。这不是不对吗?这不是购物车吗?我想它看起来倒了,但请注意,在
    产品中有
    购物车
    ,但在
    购物车中有
    列表
    。外键是在
    Product
    表中创建的,因此
    Product
    是负责并拥有关系的人。产品表中fk_cart_id列中的值是持久化关系。
    @OneToMany(mappedBy = "cart")
    private List<Product> productList;
    
    @ManyToOne
    @JoinColumn(name = "fk_cart_id")
    private Cart cart;