x的实例的JPA标识符被更改

时间:2017-10-08 10:29:59

标签: java jpa many-to-one dozer

问候所有,我的课程名为产品,课程供应商。供应商是产品的母公司。

我在产品中使用注释 ManyToOne 定义了属性供应商。

创建产品A和供应商S1后,我首先将S1与A关联。然后,当我尝试将A的供应商从S1更改为S2时,我创建了第二个供应商S2。 JPA告诉我"供应商实例的标识符从X改为Y"。

我不需要在此处创建/更新供应商。我只想将供应商从一个供应商更改为另一个供应商。

我可以知道会出现什么问题吗?

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

最诚挚的问候, 约翰

1 个答案:

答案 0 :(得分:0)

您必须首先在持久性上下文中管理供应商2。

然后您可以将其设置为Product实体中的引用。

所以..

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