2017-02-16 21 views
0

私はJPAを使用していて、多対多の関係を理解し​​たいと思っていました。私は "店"と "顧客"を持っているとしましょう。これらには多対多の関係があります。JPA ManyToMany:既存のオブジェクトを別のオブジェクトに追加する

私の理解では、Storeは多くの顧客を持つことができ、顧客は多くの店舗と関連付けることができます。だから私がやりたかったのは、2店舗と複数の顧客を作ることでした。しかし、同じ顧客をStore 1とStore 2の一部にしたかったのですが、Store 1を顧客と一緒に保存してから、同じ顧客を連れてStore 2に関連付けました。 )、私はこのエラーメッセージが表示されます。

これを解決する方法がわかりません。どんな助けやコメントも感謝しています。前もって感謝します!

​​

}

@Entity 
public class Item { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private String name; 
    private BigDecimal price; 
    public Item() { } 

    public Item(String name, BigDecimal price) { 
     this.name = name; 
     this.price = price; 
    } 
    public Item() { 
    } 
    public Item(String name, BigDecimal price) { 
     this.name = name; 
     this.price = price; 
    } 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    }  
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public BigDecimal getPrice() { 
     return price; 
    } 
    public void setPrice(BigDecimal price) { 
     this.price = price; 
    } 
} 

これは春ブート使用ドライバコードである: ストアセーフウェイ=新しいストア( "Safeway4を");

safeway.addItem(new Item("Fuji Apple", new BigDecimal(1))); 
safeway.addItem(new Item("Black Grapes", new BigDecimal(2))); 
safeway.addItem(new Item("Cheese Pizza", new BigDecimal(10))); 

Store bestBuy = new Store("Best Buy4"); 
bestBuy.addItem(new Item("55 inch TV", new BigDecimal(550))); 
bestBuy.addItem(new Item("Bluray Player", new BigDecimal(85))); 
bestBuy.addItem(new Item("Nikon SLR", new BigDecimal(1500))); 

Customer elf = new Customer(); 
elf.setName("Elf"); 
Customer neo = new Customer(); 
neo.setName("Neo"); 
safeway.getCustomers().add(elf); 
safeway.getCustomers().add(neo); 

Customer yoda = new Customer(); 
yoda.setName("Yoda"); 
Customer crazy = new Customer(); 
crazy.setName("Crazy"); 
bestBuy.getCustomers().add(yoda); 
bestBuy.getCustomers().add(crazy); 

log.debug("adding neo to best buy");   
bestBuy.getCustomers().add(neo); // Adding Neo to both stores! 

log.debug("saving safeway 1"); 
storeRepository.save(safeway); 
log.debug("saving safeway 1 done"); 

log.debug("saving bestBuy 1"); 
storeRepository.save(bestBuy); // error happens here <----------- 
log.debug("saving bestBuy 1 done"); 

答えて

0

CascadeType.ALLを削除すると、この問題は回避されます。

論理的には、Customerは、Storeに関連付けられることなく存在することができます。つまり、CustomerのライフサイクルはStoreエンティティのライフサイクルとは独立している必要があるため、Customerの操作をカスケード接続すると、Storeが間違っています。

Customerインスタンスを個別に保存し、保存したインスタンスを適切なStoreに関連付けて別々に保存します。

+0

ありがとうNaros!あなたの答えは問題を解決しました。 – Daniel

関連する問題