Java Spring JPA-多对一关系中的post资源
这个问题与(在这里解决这个问题,可能也会解决另一个问题)密切相关 在我的(github)中,我有两个资源: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
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/setCartJPA是一个高级ORM框架。这意味着java的对象引用将转换为数据库中的关系引用 因此,在您的数据库中,您将有一个外键,其中一个项引用了一辆汽车 JPA将这些关系关系转换为对象关系,这意味着您不仅可以获得汽车的引用,还可以获得汽车对象 RESTAPI返回保存对象引用的Java对象。这就是您的项目包含汽车对象的原因 如果只想返回汽车id,则必须将输出映射到新对象
public void addItem(Item item) {
this.items.add(item);
item.setCart(this);
}