Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 Spring JPA-多对一关系中的post资源_Java_Spring_Spring Mvc_Jpa_Spring Data Jpa - Fatal编程技术网

Java Spring JPA-多对一关系中的post资源

Java Spring JPA-多对一关系中的post资源,java,spring,spring-mvc,jpa,spring-data-jpa,Java,Spring,Spring Mvc,Jpa,Spring Data Jpa,这个问题与(在这里解决这个问题,可能也会解决另一个问题)密切相关 在我的(github)中,我有两个资源:Cart和Item,其中一个Cart可以有多个项目 CartController映射一个POST方法,该方法将随机项目添加到具有给定ID的购物车中 /* Forgetting about response entity and null checking etc. for now */ @PostMapping("carts/rdm/{id}") public Cart a

这个问题与(在这里解决这个问题,可能也会解决另一个问题)密切相关

在我的(github)中,我有两个资源:
Cart
Item
,其中一个Cart可以有多个项目

CartController
映射一个POST方法,该方法将随机项目添加到具有给定ID的购物车中

/* Forgetting about response entity and null checking etc. for now */

    @PostMapping("carts/rdm/{id}")
    public Cart addRandomItem(@PathVariable("id") long id)
    {
        String[] rdmItemNames = {"toothbrush", "shampoo", "body wash"};
        int rnd = new Random().nextInt(rdmItemNames.length);
        String itemName = rdmItemNames[rnd];

        // Add new item to the cart with given id
        Cart cart = dao.getById(id);

        Item item = new Item();
        item.setItemName(itemName);

        // This works but I have to create a new cart object with same id
        Cart sameCart = new Cart();
        sameCart.setId(cart.getId());
        item.setCart(sameCart);

        // This doesn't work, no surprise but I would like to
        // just retrieve the Cart, add the new Item and be done.
        // item.setCart(cart);
        // cart.getItems().add(item);
        return dao.save(cart);
    }
发布到
http://localhost:9100/carts/rdm/1
,我得到以下
Cart
json

{
    "id": 1,
    "items": [
        {
            "id": 0,
            "itemName": "body wash",
            "cart": {
                "id": 1,
                "items": null
            }
        }
    ]
}
感觉我没有正确理解JPA。这又归结为为什么
项目
对象需要包含整个
购物车
对象。如果
Item
只包含外键(购物车id),那么我可以生成这样的json

   {
        "id": 1,
        "items": [
            {
                "id": 0,
                "itemName": "body wash",
                "cart_id": 1
            }
        ]
    }

我在休息方面还处于初级阶段,但我的建议是: 创建CartServices类。控制器仅用于将数据传输到服务。 使用@transactional注释。这很难读。 我编写了非常类似的应用程序:如果您想检查: 对不起,这是我第一次申请,不是所有的东西都是英文的。但它非常相似——只有购物车用户

当你写道:

@OneToMany(mappedBy = "cart")
private Set<Item> items;
然后是Cart.addItem(项目); 及其他
当然,您需要在项目列表中创建getCart/setCart

JPA是一个高级ORM框架。这意味着java的对象引用将转换为数据库中的关系引用

因此,在您的数据库中,您将有一个外键,其中一个项引用了一辆汽车

JPA将这些关系关系转换为对象关系,这意味着您不仅可以获得汽车的引用,还可以获得汽车对象

RESTAPI返回保存对象引用的Java对象。这就是您的项目包含汽车对象的原因

如果只想返回汽车id,则必须将输出映射到新对象

public void addItem(Item item) {
    this.items.add(item);
    item.setCart(this);
}