JPA多对多:将现有的对象到另一个对象
问题描述:
我使用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");
答
如果您删除了CascadeType.ALL
,则可以避免此问题。
从逻辑上讲,Customer
而没有被关联到任何Store
可以存在。这意味着一个Customer
的生命周期应该是独立的,一个Store
实体的,从而从Store
级联任何操作要Customer
是错误的。
单独保存您的Customer
实例,将保存的实例与相应的Store
关联,然后单独保存。
谢谢Naros!你的回答解决了这个问题。 – Daniel