好朋友。
Hibernate的JPA实现存在问题。我使用spring-boot-starter-data-jpa和PostgreSql v9。
我有两个实体通过OneToMany& amp;多对一:
@Entity
public class ShoppingCart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@OneToMany(mappedBy = "shoppingCart", cascade = {CascadeType.ALL})
private List<Good> goods = new ArrayList<>();
public void addGood(Good good) {
good.setShoppingCart(this);
goods.add(good);
}
public Good removeGood(Good good) {
goods.remove(good);
good.setShoppingCart(null);
return good;
}
public ShoppingCart() {
}
public List<Good> getGoods() {
return goods;
}
public ShoppingCart(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
}
第二个实体是
@Entity
public class Good {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "cart_id")
@JsonIgnore
private ShoppingCart shoppingCart;
public ShoppingCart getShoppingCart() {
return shoppingCart;
}
public void setShoppingCart(ShoppingCart shoppingCart) {
this.shoppingCart = shoppingCart;
}
public Good(String name) {
this.name = name;
}
public Good() {
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
}
我也使用CrudRepository访问ShoppingCart
public interface ShoppingCartRepository extends CrudRepository<ShoppingCart, Long> {}
当我尝试填充现有购物车时,我的数据库中有两件商品。这是将一些商品添加到现有购物车中的代码:
ShoppingCart cart = shoppingCartRepository.findOne(id);
cart.addGood(new Good("Butter"));
return shoppingCartRepository.save(cart);
在表“good”中,我现在有两个具有不同PKey和相同数据的元素
5;"Butter";100
6;"Butter";100
为什么会这样?
此外,当我尝试在repository.save行插入断点时,我在购物车中只看到一个商品清单。
答案 0 :(得分:1)
所以,问题解决了。
解决的第一种方法是使用保存代码@Transactional制作方法。
Secon方式是使用getGoods()代替商品。我们应该更改此代码
public void addGood(Good good) {
good.setShoppingCart(this);
goods.add(good);
}
public Good removeGood(Good good) {
goods.remove(good);
good.setShoppingCart(null);
return good;
}
到这个
public void addGood(Good good) {
good.setShoppingCart(this);
this.getGoods().add(good);
}
public Good removeGood(Good good) {
this.getGoods().remove(good);
good.setShoppingCart(null);
return good;
}
getGoods()在这里强制hibernate更新对象的状态,一切正常。
至于我,我一起使用两种方式
答案 1 :(得分:0)
这是因为您创建了一个没有id的新Good对象。因此,Hibernate将生成一个新的id并持久保存新对象。如果您不想创建新对象,但只想分配现有对象,则必须从数据库中获取现有对象并将其分配给ShoppingCart或者如果您创建新的Good对象,则添加ID。 / p>