Spring Boot 实体之间的联接列获取NULL值,而不是父实体ID号

xj3cbfub  于 2022-11-29  发布在  Spring
关注(0)|答案(1)|浏览(133)

我正在使用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);
    }
//...
}

我试着为其他实体做单向关系,它确实在联接的列字段上创建了外键。但我想找出为什么我的双向联接方式是错误的。也许真正了解的人可以解释。

ar7v8xwq

ar7v8xwq1#

Order类应如下所示:

@Entity

公共类订单{

@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;

和Item类,而不包含Orders类及其ManyToOne关系。
现在关系是单向的。项目实体具有外键列名ORDERS_ID,该列具有项目所属的订单的ID。

相关问题