2017-02-16 136 views
0

我使用JPA,想弄清楚如何将许多一对多的关系。假设我有一个“商店”和一个“客户”。这些有很多关系。JPA多对多:将现有的对象到另一个对象

所以我的理解是,一个商店可以有很多的客户,和客户可以用许多商店有关。所以我想要做的是创建两个商店和几个客户。然后,我想让同一位顾客成为商店1和商店2的一部分。但是,当我将商店1与顾客保存在一起时,然后拿走了同一位顾客并将其与商店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; 
    } 
} 

这是使用Spring的引导驱动代码: 商店西夫韦=新店( “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实体的,从而从Store级联任何操作要Customer是错误的。

单独保存您的Customer实例,将保存的实例与相应的Store关联,然后单独保存。

+0

谢谢Naros!你的回答解决了这个问题。 – Daniel