Spring JPA - 在多对一关系中发布资源

时间:2018-02-21 11:59:30

标签: java spring spring-mvc jpa spring-data-jpa

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

在我的spring mvc app(github)中,我有两个资源:CartItem,其中购物车可以有多个项目。

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对象需要包含整个Cart对象的原因。如果Item只包含外键(购物车ID),那么我可以生成这样的json

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

2 个答案:

答案 0 :(得分:1)

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

因此,在您的数据库中,您将拥有一个项目引用汽车的外键。

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

您的Rest-API返回包含Object-References的Java-Object。这就是您的商品包含Car-Object的原因。

如果您只想返回car_id,则必须将输出映射到新对象。

答案 1 :(得分:0)

我是REST的初级,但我的建议是: 创建CartServices类。控制器仅用于将数据传输到服务。 使用@transactional注释。很难读懂。 我写了非常相似的应用程序:如果你想检查: https://github.com/justassub/ShopProject/tree/master/RESTserver/src/main/java/lt/it/akademija 对不起,这是我的第一份申请,而不是一切都是英文的。但它非常相似 - 只有购物车 - 用户。

当你写道:

 @OneToMany(mappedBy = "cart")
private Set<Item> items;

写方法:

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

然后是Cart.addItem(item); 和别的 当然,您需要在商品列表

中创建getCart / setCart