双向onetomany不更新外键
Bidirectional onetomany doesnt update foriegn key
我已经使用休眠注释实现了双向 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
}
以下是项目class:
@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();
}
这会在购物车 table 中插入一条记录,并在商品 table 中插入 2 条记录。但是,项目 table 中的 cart_id 列未更新。知道为什么吗?
我已经根据以下示例实现了这一点:
https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/
正如 Vlad Mihalcea 在他的精彩文章中所解释的那样:...您需要 synchronize both end of the bidirectional association.
对于 session.save(c1);
之前的情况,您应该添加:
item1.setCart(c1);
item2.setCart(c1);
或者,最好在 Cart
class 中创建辅助方法,例如:
public void addItem(Item item) {
items.add(item);
item.setCart(this);
}
public void removeItem(Item item) {
items.remove(item);
item.setCart(null);
}
在您的 Cart 实体中,id 的列名称必须是 cart_id,因为在您的 Item class 中,您将它用于 JoinColumn。他们应该有相同的名字。
我已经使用休眠注释实现了双向 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
}
以下是项目class:
@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();
}
这会在购物车 table 中插入一条记录,并在商品 table 中插入 2 条记录。但是,项目 table 中的 cart_id 列未更新。知道为什么吗?
我已经根据以下示例实现了这一点: https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/
正如 Vlad Mihalcea 在他的精彩文章中所解释的那样:...您需要 synchronize both end of the bidirectional association.
对于 session.save(c1);
之前的情况,您应该添加:
item1.setCart(c1);
item2.setCart(c1);
或者,最好在 Cart
class 中创建辅助方法,例如:
public void addItem(Item item) {
items.add(item);
item.setCart(this);
}
public void removeItem(Item item) {
items.remove(item);
item.setCart(null);
}
在您的 Cart 实体中,id 的列名称必须是 cart_id,因为在您的 Item class 中,您将它用于 JoinColumn。他们应该有相同的名字。