Hibernate创建两行而不是一行

时间:2015-11-12 15:34:12

标签: java spring hibernate postgresql jpa

好朋友。

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行插入断点时,我在购物车中只看到一个商品清单。

2 个答案:

答案 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>