java - x 实例的 JPA 标识符已更改

标签 java jpa many-to-one dozer

大家好,我有一个名为产品的类和供应商类。供应商是产品的父级。

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

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

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

最诚挚的问候, 约翰

最佳答案

您必须首先在持久性上下文下管理供应商 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);

关于java - x 实例的 JPA 标识符已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46630071/

相关文章:

forms - 带有 Hibernate 的 Spring MVC - 表单中的 OneToMany 映射

java - Java将同一个对象多次传递给不同的方法

mysql - 我无法连接 MySQL 数据库 WildFly - Hibernate

hibernate - JPA onetoMany/ManytoOne 持续存在 - 违反完整性约束 - 找不到父键

java - 没有名为 *** 的 EntityManager 的持久性提供程序

mysql - 由 : java. sql.SQLSyntaxErrorException : [. ..] 版本引起,以便在第 1 行 'order (id)' 附近使用正确的语法

mysql - Hibernate 使用 ManyToOne 注释保存新条目

java - 使用不带注释的@JsonIdentityInfo

java - 查询 JVM 堆中的特定对象

java - 如何将文件中的换行符保存为 LF (Unix 约定)?