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)将不起作用。
我每次尝试向客户端添加重复产品时都会收到错误消息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)将不起作用。