JPA/Hibernate 如何使用 @OneToMany 映射将重复值添加到 List<>

JPA/Hibernate How to add duplicate values to a List<> with a @OneToMany mapping

我每次尝试向客户端添加重复产品时都会收到错误消息class。

org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk_8opk6otadh2pkvi9bghguwp89"
  Detail: Key (products_id)=(500010) already exists.

我的实体

@Entity
public class Client {
    @Id
    private String id;

    @OneToMany
    private List<Product> products;
}

@Entity
public class Product {
    @Id
    private String id;

    private Boolean foreign;
    private Integer price;
}

当我调用 .save() 时,hibernate 正在尝试重新保存一个已经存在的产品。我相信这是由于它如何级联事物。

public Client addNewProduct(Client client, Product newProduct) {
    List<Product> products = client.getProducts();
    products.add(newProduct);
    client.setProducts(products);
    return clientRepository.save(client);
}

我只想能够将重复项添加到列表<>。我相信这是&应该是单向关系。

这不适用于你目前的关系,我不明白你为什么要添加重复项,但如果你必须这样做,那么你必须为此创建一个新实体。一个例子是这样的:

@Entity
public class ProductBatch {

  @Id
  private String id;

  @OneToOne
  private Product product;

  private Integer count;

  // getter & setter
}

然后像这样更改 Client

@Entity
public class Client {

    @Id
    private String id;

    @OneToMany
    private List<ProductBatch> products;
}

这使得您的 addNewProduct 函数可以实现这样的功能:

public Client addNewProduct(Client client, Product newProduct) {
    List<ProductBatch> products = client.getProducts();
    boolean exists = false;
    for(ProductBatch product : products) {
        if(product.getProduct().equals(newProduct)) {
            product.setCount(product.getCount() + 1);
            exists = true;
        }
    }
    if(!exists) {
        BatchProduct product = new BatchProduct();
        product.setProduct(newProduct);
        product.setCount(0);
        products.add(product);
    }
    client.setProducts(products);
    return clientRepository.save(client);
}

这与 JPA 或 Hibernate 无关。约束是数据库约束,这是正确的。如果外键已经是 table 的一部分,则尝试再次添加它会违反此约束。 ID 是唯一的,应该保持这种状态。所以添加重复项(至少具有相同的 ID)将不起作用。