jpa:使用单向@onetomany时,子实体中的reference列为null

dojqjjoe  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(366)

我有两个实体类。
订单.java

@Entity
@Table(name = "order_table")
public class Order implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "order_id", referencedColumnName = "id", nullable = false, insertable=false, updatable=false)
    private Set<Item> items;

    // getters & setters & toString

项目.java

@Entity
@Table(name = "item")
public class Item implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "order_id", nullable = false)
    private Long orderId;

    // getters & setters && toString

我创建了这样一个测试类:

@Test
public void createOrderWithItems() {

    Item item = new Item();
    item.setName("Iron Man");

    Order order = new Order();
    order.setName("Toy");
    order.getItems().add(item);

    Order created = service.createOrder(order);

    Order orderById = service.getOrderById(order.getId());
    System.out.println("Created Order: " + orderById);

    Item itemById = service.getItemById(item.getId());
    System.out.println("Created item: " + itemById);

    Assert.notNull(created.getId(), "Order ID is Null");
}

测试是绿色的,但如果你检查输出,你会看到 orderId 中的字段 Item 类为空。

Created Order: Order{id=1, name='Toy', items=[Item{id=2, name='Iron Man', orderId=null}]}
Created item: Item{id=2, name='Iron Man', orderId=null}

jpa不会自动更新db中的这个列吗?这个栏目是多余的吗?如果是这样,我如何从测试代码中检索这些信息?

vs3odd8k

vs3odd8k1#

您需要显式地设置orderid。

item.setOrderId(order.getId());
order.getItems().add(item);

您可以创建一个方法 addItem(Item item) 在你的 Order 类并在其中隐藏此逻辑。
级联将在db中创建一个条目,但不会初始化字段。jpa注解只是向jpa提供者指示如何在实体和表之间执行Map。
此外,请检查注解。 @JoinColumn 应在拥有关系的实体中使用(对应表的列作为外键)。查看这个问题的顶部答案以获得详细解释:@joincolumn和mappedby在使用jpa@onetomany关联时有什么区别

相关问题