【问题标题】:Bidirectional onetomany doesnt update foriegn key [duplicate]双向单机不更新外键[重复]
【发布时间】:2019-03-19 04:40:54
【问题描述】:

我已经使用休眠注释实现了双向 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 条记录。但是 item 表中的 cart_id 列没有更新。知道为什么吗?

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 不,不是这种情况 =) 在这里 - stackoverflow.com/a/52805306/8189903 实际上,它不需要将外键命名为与它引用的主键相同的方式
    • 你是对的,但问题是如果你有不同的名字,那么你必须提到referencedColumnName。示例:@JoinColumn(name = "differentName", referencedColumnName = "exactColumnName")。因此,您必须以某种方式提及您要加入的确切列名。
    • 你也可以阅读这个。 stackoverflow.com/questions/11156199/…
    【解决方案2】:

    正如 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);
    }
    

    【讨论】:

    猜你喜欢
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多