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);