简体   繁体   English

加入实体之间的列得到 NULL 值而不是父实体 ID 号

[英]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.

相关问题 Spring Data JPA同时保存两个实体,“ user_id”列中为空值 - Spring Data JPA saving two entities at the same time, null value in column “user_id” JPA-如何实现此SQL行为(左联接父实体到先前内部联接的子实体和大子实体) - JPA - How to achieve this SQL behaviour (left join parent entity to previously inner joined child & grand child entities) Redis 将空值返回到 id 列 - Redis return null value to id column 如何使用注释在具有主键以外的列的 2 个实体之间加入? - How do i join between 2 entities with column other than primary key using annotations? 卷曲POST将空值插入表中的“连接”列 - Curl POST Inserts Null Value to the table For Join Column 双向映射 null 值保留在子项的父引用列中 - Bidirectional mapping null value is persisted in parent reference column in child 用 null id 保存实体 JPA - Save entity JPA with null id Null 在 Postgres 中插入期间“id”列中的值 SQL - Null value in column “id” during insert in Postgres SQL 删除父记录时,子连接表上的 JDBC 错误列不能是 null - JDBC Error Column cannot be null on child join table when deleting a parent record 如何从 Hibernate Jpa 中的父实体仅获取 ChildIds(而不是整个子对象)? - How to get only ChildIds(Instead of whole child Object) from parent entity in Hibernate Jpa?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM