2017-10-08 99 views
1

問候所有,我有類叫做產品和類供應商。供應商是產品的母公司。x的一個實例的JPA標識符已被更改

我在產品中定義屬性供應商時帶註釋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); 

最好的問候, 約翰

+0

爲什麼不張貼出一碼你到底在做什麼? – ujulu

+0

根據您的要求 – John

回答

0

你必須要持久化上下文管理下第一供應商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); 
+0

感謝您的回覆。但就我而言,供應商1和2都是現有實體。他們不需要創建/更新。我使用find方法獲取供應商2實體並將其分配給產品A實體。但是,JPA拋出錯誤。任何線索? – John

+0

嘗試更新 –

+0

在當前的JPA實現AFAIR中沒有辦法從實體管理器中斷開一個對象。 – John

相關問題