簡體   English   中英

Spring JPA - 在多對一關系中發布資源

[英]Spring JPA - post resource in many to one relationships

這個問題是密切相關的這一個(在這里解決這一塊,可能還解決了其他)。

在我的spring mvc 應用程序(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
            }
        ]
    }

JPA 是一個高級 ORM 框架。 這意味着 java 的對象引用被轉換為數據庫中的關系引用。

因此,在您的數據庫中,您將有一個外鍵,其中項目引用了汽車。

JPA 將這些關系關系轉換為對象關系,這意味着您不僅會獲得汽車的引用,還會獲得汽車對象。

您的 Rest-API 返回包含對象引用的 Java 對象。 這就是為什么您的項目包含汽車對象。

如果只想返回 car_id,則必須將輸出映射到新對象。

我是 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM