x 实例的 JPA 标识符已更改
JPA identifier of an instance of x was altered
大家好,我有 class 叫 Product 和 class Supplier。供应商是产品的父级。
我在带有注释的产品中定义了属性供应商 ManyToOne。
创建产品A和供应商S1后,我首先将S1与A关联起来。然后,当我尝试将 A 的供应商从 S1 更改为 S2 时,我创建了第二个供应商 S2。 JPA 告诉我 "identifier of an instance of Supplier was altered from X to Y".
我不需要create/update这里的供应商。我只想为产品 A 更换供应商。
请问哪里出了问题?
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@ManyToOne(cascade=CascadeType.ALL)
private Company supplier;
...
}
来自服务的代码:
Product productDB=this.findProductByProductIDCurrentUser(productForm.getId());
dozer.map(productForm, productDB);
if(productForm.getSupplier()!=null){
Company company =
companyRepository.findOne(productForm.getSupplier().getId() );
if(company!=null){
Company supplier = new Company();
supplier.setId(productForm.getSupplier().getId());
productDB.setSupplier(supplier);
}
}
em.merge(productDB);
此致,
约翰
你得先让Supplier 2在persistence context下管理。
然后您可以将其设置为产品实体中的引用。
所以..
ProductA productA = session.findProductA(..);
Supplier s2 = new Supplier();
// construct s2
em.merge(s2);
productA.setSupplier(s2);
em.merge(productA); // optional
更新
您也可以尝试分离产品,设置产品并再次合并:
em.detach(product);
product.setSupplier(s2);
em.merge(product);
大家好,我有 class 叫 Product 和 class Supplier。供应商是产品的父级。
我在带有注释的产品中定义了属性供应商 ManyToOne。
创建产品A和供应商S1后,我首先将S1与A关联起来。然后,当我尝试将 A 的供应商从 S1 更改为 S2 时,我创建了第二个供应商 S2。 JPA 告诉我 "identifier of an instance of Supplier was altered from X to Y".
我不需要create/update这里的供应商。我只想为产品 A 更换供应商。
请问哪里出了问题?
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@ManyToOne(cascade=CascadeType.ALL)
private Company supplier;
...
}
来自服务的代码:
Product productDB=this.findProductByProductIDCurrentUser(productForm.getId());
dozer.map(productForm, productDB);
if(productForm.getSupplier()!=null){
Company company =
companyRepository.findOne(productForm.getSupplier().getId() );
if(company!=null){
Company supplier = new Company();
supplier.setId(productForm.getSupplier().getId());
productDB.setSupplier(supplier);
}
}
em.merge(productDB);
此致, 约翰
你得先让Supplier 2在persistence context下管理。
然后您可以将其设置为产品实体中的引用。
所以..
ProductA productA = session.findProductA(..);
Supplier s2 = new Supplier();
// construct s2
em.merge(s2);
productA.setSupplier(s2);
em.merge(productA); // optional
更新
您也可以尝试分离产品,设置产品并再次合并:
em.detach(product);
product.setSupplier(s2);
em.merge(product);