2017-02-16 11 views
0

Я использую JPA и хотел выяснить, как отношения «многие ко многим». Допустим, у меня есть «Магазин» и «Клиент». У них много отношений.JPA ManyToMany: Добавление существующего объекта к другому объекту

Так что я понимаю, что в Магазине может быть много Клиентов, а Клиент может быть связан со многими Магазинами. Поэтому я хотел бы создать две магазины и несколько клиентов. Затем я хотел, чтобы один и тот же клиент был частью Store 1 и Store 2. Однако, когда я сохранил Store 1 с клиентом, а затем взял того же клиента и связал его с Store 2 (скажем, магазины клиентов в обоих магазинах), Я получаю это сообщение об ошибке: удаленный объект передан для сохранения.

Не знаете, как это решить. Любая помощь и комментарии приветствуются. Заранее спасибо!

@Entity 
public class Store { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    private String name; 

    @OneToMany(cascade=CascadeType.ALL, orphanRemoval=true) 
    private List<Item> items = new ArrayList<>(); 

    @ManyToMany(cascade=CascadeType.ALL) 
    private List<Customer> customers = new ArrayList<>(); 

    public List<Customer> getCustomers() { 
     return customers; 
    } 
    public void setCustomers(List<Customer> customers) { 
     this.customers = customers; 
    } 
    public Store() { 
    } 
    public Store(String name) { 
     this.name = name; 
    } 
    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 List<Item> getItems() { 
     return items; 
    } 
    public void setItems(List<Item> items) { 
     this.items = items; 
    } 
    public Store addItem(Item item) { 
     items.add(item); 
     return this; 
    } 
} 

@Entity 
public class Customer { 

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long id; 

private String name; 

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

}

@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; 
    } 
} 

Это код драйвера, используя Spring Ботинок: магазин Safeway = новый магазин ("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

Спасибо, Нарос! Ваш ответ устранил проблему. – Daniel