我正在使用Java上的Spring Boot来创建用户的订单。一个新的Orders对象被创建,它有一个Linked Set of Items。这些项目是用户的购物车内容。
创建了订单,但是它的项目集是空的。集合大小是0。我在JUnit测试中检查过了。你能帮我找出错误吗?也许我定义的实体不正确?看一下数据库的图片:
并检查实体,Orders:
@Entity
public class Orders {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@NotEmpty
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime submitedAt;
@NotEmpty
private String orderName;
@NotEmpty
@Column(name="`User`")
private String username;
@Enumerated(EnumType.STRING)
@Column
private OrderStatus status;
@OneToMany(mappedBy = "orders", cascade = { CascadeType.ALL}, fetch = FetchType.LAZY)
private Set<Item> items;
项目名称:
@Entity
public class Item {
@Id
private Integer id;
@Column(name="`NAME`")
private String dishName;
@Column(name = "`DESCRIPTION`", length = 2000)
private String dishDescription;
@Column(name = "`QUANTITY`")
private Integer quantityInCart;
@Column(name = "`USER`")
private String username;
@ManyToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH })
@JoinColumn(name = "ORDERS_ID")
private Orders orders;
如何正确处理实体关系?应该是单向还是双向关系?这些关系有什么区别?我应该使用什么样的关系?为什么?我在为Orders
服务方法做JUnit测试。结果表明,它可以创建订单。并从用户的购物车订购物品。但何时显示订单(GetMapping),然后它返回Orders实体,其中包含空的items
集合。我认为这是因为JPA找不到其指定订单项的外键。它为空。为什么它为空?
这是根据用户请求创建此类订单的服务方法:
@Transactional
public ResponseEntity<String> createOrder (String username) {
User user = userService.findByUsername(username);
List<CartItem> items = cartRepo.findByUser(user);
if(items.size() > 0) {
Orders newOrder = new Orders();
Set<Item> orderItems = new LinkedHashSet<>();
for(CartItem item : items) {
// new Item(Integer id, String dishName, String dishDescription, Integer quantityInCart, String username)
Item orderItem = new Item(item.getId(), item.getDish().getName(),
item.getDish().getDescription(), item.getQuantity(), item.getUser().getUsername());
orderItems.add(orderItem);
}
newOrder.setItems(orderItems);
newOrder.setOrderName(user.getUsername()+"'s order");
newOrder.setStatus(OrderStatus.SUBMIT);
newOrder.setSubmitedAt();
newOrder.setUsername(username);
orderDao.save(newOrder);
cartService.removeAllUserProducts(username);
LOG.info("[{}]: A new order is created successfully.", username);
return new ResponseEntity<String>("A new order is created successfully.", HttpStatus.CREATED);
}
//...
}
我试着为其他实体做单向关系,它确实在联接的列字段上创建了外键。但我想找出为什么我的双向联接方式是错误的。也许真正了解的人可以解释。
1条答案
按热度按时间ar7v8xwq1#
Order类应如下所示:
公共类订单{
和Item类,而不包含Orders类及其ManyToOne关系。
现在关系是单向的。项目实体具有外键列名ORDERS_ID,该列具有项目所属的订单的ID。