Java JPA ManyToMany:将现有对象添加到另一个对象

Java JPA ManyToMany:将现有对象添加到另一个对象,java,spring,jpa,spring-boot,Java,Spring,Jpa,Spring Boot,我正在使用JPA,想弄清楚多对多的关系。假设我有一家商店和一位顾客。这些有一个多对多的关系 所以我的理解是,一个商店可以有很多顾客,顾客可以和很多商店联系在一起。所以我想做的是创建两个商店和几个客户。然后我想让同一个客户成为1号店和2号店的一部分。但是,当我将Store 1与客户一起保存,然后将同一客户与Store 2关联(假设客户在两个商店都购物)时,我收到以下错误消息:已分离的实体已传递到persist 不知道如何解决这个问题。任何帮助和意见都将不胜感激。提前谢谢 @Entity publi

我正在使用JPA,想弄清楚多对多的关系。假设我有一家商店和一位顾客。这些有一个多对多的关系

所以我的理解是,一个商店可以有很多顾客,顾客可以和很多商店联系在一起。所以我想做的是创建两个商店和几个客户。然后我想让同一个客户成为1号店和2号店的一部分。但是,当我将Store 1与客户一起保存,然后将同一客户与Store 2关联(假设客户在两个商店都购物)时,我收到以下错误消息:已分离的实体已传递到persist

不知道如何解决这个问题。任何帮助和意见都将不胜感激。提前谢谢

@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;
}
这是使用Spring Boot的驱动程序代码: Store safeway=新StoreSafeway 4

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,则可以避免此问题

从逻辑上讲,客户可以不与任何商店关联而存在。这意味着客户的生命周期应该独立于商店实体的生命周期,因此从商店中为客户级联任何操作都是错误的


您可以单独保存客户实例,将保存的实例与相应的存储关联,然后单独保存。

谢谢您,Naros!你的回答解决了这个问题。
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");