[英]Join Column between entities get NULL value instead of parent entity id number
I am Using Spring Boot on Java to create user's order on his checkout.我在 Java 上使用 Spring Boot 在结账时创建用户订单。 A new Orders object is created which has a Linked Set of Items.创建了一个新订单 object,其中包含一组链接的项目。 Those items are user's cart contents.这些项目是用户的购物车内容。
Order is created, but its set of Items is null. The set size is 0. I checked that in JUnit tests.订单已创建,但其项目集为 null。集大小为 0。我在 JUnit 测试中检查过。 Can you help me to find out what is wrong?你能帮我找出问题所在吗? Maybe I have defined entities incorrectly?也许我错误地定义了实体? Have a look at the picture of the database:看一下数据库的图片:
And check the entities, 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;
Item:物品:
@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;
How to do entities relation correctly?如何正确建立实体关系? Should it be one direction or bi-directional relationship?应该是单向关系还是双向关系? What are differences of these relations?这些关系有什么区别? And what kind of relationship I should use?我应该使用什么样的关系? Why?为什么? I was doing JUnit tests for the Orders
service methods.我正在对Orders
服务方法进行 JUnit 测试。 It turns out that it can create orders.事实证明,它可以创建订单。 And Order items from user's cart.并从用户的购物车中订购商品。 But when it is time to show order (GetMapping) then it returns Orders entity with empty items
set.但是当需要显示订单 (GetMapping) 时,它会返回带有空items
集的 Orders 实体。 I think it happens because JPA cannot find foreign key of items for its designated order.我认为这是因为 JPA 找不到其指定订单的项目外键。 It is null. Why is it null?是null,为什么是null?
And this is the service method that creates such order by user request:这是根据用户请求创建此类订单的服务方法:
@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);
}
//...
}
I tried to do one direction relationship for other entities and it really created foreign keys on joined column fields.我尝试为其他实体建立单向关系,它确实在连接的列字段上创建了外键。 But I want to find out why my bidirectional way of joining is wrong.但是我想找出为什么我的双向加入方式是错误的。 Maybe someone who really knows can explain.也许真正了解的人可以解释一下。
The Order class should be like this:订单 class 应该是这样的:
@Entity
public class Orders {公共 class 订单 {
@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(cascade = { CascadeType.ALL}, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name="ORDERS_ID")
private Set<Item> items;
And Item class without Orders class and its ManyToOne relationship.并且 Item class 没有 Orders class 及其 ManyToOne 关系。
Now relationship is unidirectional.现在关系是单向的。 Item entity has foreign keys column name ORDERS_ID that has id's of Orders for which Items belong. Item 实体具有外键列名称 ORDERS_ID,该列具有 Items 所属的 Orders 的 ID。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.