代码之家  ›  专栏  ›  技术社区  ›  John

x实例的JPA标识符已更改

  •  1
  • John  · 技术社区  · 9 年前

    问候大家,我有课叫 产品 和类 供应商 . 供应商是产品的母公司。

    我在带有注释的产品中定义了属性supplier 多对一 .

    我不需要在此处创建/更新供应商。我只想把产品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);
    

    顺致敬意, 约翰

    1 回复  |  直到 9 年前
        1
  •  0
  •   Maciej Kowalski    9 年前

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

    所以

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