[英]Spring JPA - post resource in many to one relationships
这个问题是密切相关的这一个(在这里解决这一块,可能还解决了其他)。
在我的spring mvc 应用程序(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
}
]
}
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.