双向onetomany不更新外键

时间:2018-10-14 17:11:16

标签: java hibernate one-to-many hibernate-mapping

我已经使用休眠注释实现了双向OneToMany关联。以下是我的代码:

@Entity
@Table(name="Cart")
public class Cart {

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name="id")
  private int id;

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

  @OneToMany(cascade=CascadeType.ALL, mappedBy="cart")
  private List<Item> items;
  //getters and setters
}

以下是Item类:

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

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name="id")
  private int id;

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

  @ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
  @JoinColumn(name="cart_id")
  private Cart cart;

  //getters and setters
}

以下代码保存数据:

public static void saveCart(Session session) {
    Transaction tx = session.beginTransaction();

    Cart c1 = new Cart();
    c1.setName("Cart 1");

    Item item1 = new Item();
    item1.setName("item1");

    Item item2 = new Item();
    item2.setName("item2");

    List<Item> items = new ArrayList<Item>();
    items.add(item1);
    items.add(item2);

    c1.setItems(items);

    session.save(c1);
    tx.commit();
}

这将在cart表中插入一条记录,在items表中插入2条记录。但是,项目表中的cart_id列未更新。知道为什么吗?

我已经根据以下示例实现了这一点: https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/

2 个答案:

答案 0 :(得分:1)

正如弗拉德·米哈尔恰(Vlad Mihalcea)在他的精彩文章中所解释的: ...您需要synchronize both end of the bidirectional association

对于session.save(c1);之前的情况,您应该添加:

item1.setCart(c1);
item2.setCart(c1);

或者,最好在您的Cart类中创建辅助方法,例如:

public void addItem(Item item) {
    items.add(item);
    item.setCart(this);
}

public void removeItem(Item item) {
    items.remove(item);
    item.setCart(null);
}

答案 1 :(得分:0)

在您的Cart实体中,id的列名称必须为cart_id,因为您在Item类中将其用于JoinColumn。它们应该具有相同的名称。