这个问题与this one密切相关(在这里解决这个问题,可能也会解决另一个问题)。
在我的spring mvc app(github)中,我有两个资源:Cart
和Item
,其中购物车可以有多个项目。
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
}
]
}
答案 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