2017-10-08 14 views
1

おはようございます、私はとクラスサプライヤと呼ばれるクラスがあります。サプライヤは製品の親です。xのインスタンスのJPA識別子が変更されました

注釈付き商品に属性提供者を定義しましたManyToOne

作成した製品AとサプライヤS1の後、まずS1をAに関連付けます。次に、サプライヤS2を作成しました。サプライヤをS1から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); 

よろしく、 ジョン

+0

をなぜ示すコードを投稿していませんあなたは何をしているのですか? – ujulu

+0

ご要望に応じて – John

答えて

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

ありがとうございます。しかし私の場合、サプライヤ1と2はどちらも既存のエンティティです。彼らは作成/更新する必要はありません。私は、仕入先2のエンティティを取得し、製品Aのエンティティに割り当てるためにfindメソッドを使用しました。ただし、JPAはエラーをスローします。すべての手がかりは? – John

+0

アップデートを試してください –

+0

現在のJPA実装であるAFAIRのエンティティマネージャから1つのオブジェクトを切断する方法はありません。 – John

関連する問題