簡體   English   中英

JPA:使用單向@OneToMany時,子實體中的引用列為null

[英]JPA: Reference column in the child entity is null when using unidirectional @OneToMany

我有兩個實體類。

Order.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

Item.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");
}

測試為綠色,但如果您檢查輸出,則會看到Item類中的orderId字段為null。

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是否不會自動更新數據庫中的此列? 此列是否多余? 如果是這樣,我如何從測試代碼中檢索此信息?

您需要顯式設置orderId。

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

您可以在Order類中創建方法addItem(Item item)並在其中隱藏此邏輯。

級聯將在db中創建一個條目,但不會初始化字段。 JPA批注僅向JPA提供程序指示如何在實體和表之間執行映射。

此外,請檢查您的注釋。 @JoinColumn應該在擁有關系的實體中使用(相應的表將列作為外鍵)。 檢查此問題的頂部答案以獲取詳細說明: 使用JPA @OneToMany關聯時,@ JoinColumn和maptedBy有什么區別?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM