gpt4 book ai didi

java - 如何解决javax.persistence.EntityExistsException : a different object with the same identifier value was already associated with the session

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:40 25 4
gpt4 key购买 nike

我使用迭代来保存集合中的所有实体。然后我就有这个问题了。我尝试了persist()和merge(),但实体的Id似乎从未改变。如果有人能提供帮助,我将不胜感激。

我的道

@Repository
public class SaleOrderDAOImpl implements SaleOrderDAO{

@PersistenceContext
private EntityManager em;

@Override
public void save(SaleOrder sale) {
// TODO Auto-generated method stub
if(sale.getId() == null)em.persist(sale);
else
em.merge(sale);
}

@Override
public SaleOrder getById(Integer id) {
// TODO Auto-generated method stub
return em.find(SaleOrder.class,id );
}

}

相关功能

@Override
public Set<SaleOrder> generateOrder(Integer cus_id) {
// TODO Auto-generated method stub
Set<SaleOrder> orders = new HashSet<>();
Customer consumer = (Customer) userDAO.findUserById(cus_id);
if(consumer == null) throw new NullPointerException();
Cart cart = consumer.getCart();
System.out.println(cart);
if(cart == null) return null;

// 生成订单

SaleOrder fake = new SaleOrder();
fake.setProvider(new Artist());
orders.add(fake);
boolean flag = false;
for(CartItem item :cart.getItems()){
Artist seller = item.getProduct().getSeller();
flag = false;
while(true){
for(SaleOrder order:orders)
if(order.getProvider().equals(seller))order.getItems().add(item);
else{
SaleOrder another = new SaleOrder();
another.getItems().add(item);
another.setProvider(seller);
another.setConsumer(consumer);
orders.add(another);
flag = true;
break;
}
if(flag == true) break;
}
}
orders.remove(fake);
Iterator iter = orders.iterator();
SaleOrder order;
while(iter.hasNext()){
order = (SaleOrder) iter.next();
order.calcTotal();
soDAO.save(order); // call SaleOrderDAO, and problem occurs here.
}

// 清空购物车

cart.Empty();

return orders;
}

我的 SaleOrder 类

@Entity
@Table(name ="myorder")
@DiscriminatorValue("Sale")
public class SaleOrder extends Order {

// private List<Feedback> feedbacks;


@OneToMany(mappedBy="order")
private Set<CartItem> items;

@OneToOne(cascade = CascadeType.ALL,mappedBy="order")
private Payment payment;


private Double total;

// constructor

public SaleOrder(){
this.setStatus("Unpaid");
}


// BusinessLogic

public void calcTotal(){
Double total = 0.0;
for(CartItem item:items){
total+= item.getProduct().getPrice()*item.getQuantity();
}
this.total=total;
}

public void changeStatus(){
if(payment.isPaid())this.setStatus("Paid");
}

@Override
public void specify(){
super.specify();
total += this.getShipment().getPrice();
this.payment = new Payment(total);
}

我的订单.class

@Entity
@Table(name = "myorder")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Order{


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

@ManyToOne( fetch = FetchType.LAZY)
@MapsId
@JoinColumn(name = "consumer_id")
private Customer consumer; // 下订单的人

@ManyToOne(fetch = FetchType.LAZY)
@MapsId
@JoinColumn(name = "provider_id")
private Artist provider; // 即卖家

private String status;

@OneToOne(targetEntity = Address.class,fetch = FetchType.EAGER)
private Address addr;

@Column(columnDefinition = "timestamp on update current_timestamp")
private Timestamp orderDate;

@OneToOne(cascade = CascadeType.ALL,targetEntity = Shipment.class,fetch = FetchType.EAGER)
private Shipment shipment;

// Business Logic

/**
* 生成最终订单
*/
public void specify(){};

/**
* 更改订单支付状态
*/
public void changeStatus(){};


// getters and setters

提前致谢。

最佳答案

虽然我没有 SaleOrder 类可供查看,但我认为有两件事:

1) id 类型是 String 并初始化为“”。在这种情况下,请确保将其初始化为 null

2) id 类型是 int 或主要类型。在这种情况下,我建议将其更改为 Integer 之类的 Object 类型,然后将其初始化为 null。

关于java - 如何解决javax.persistence.EntityExistsException : a different object with the same identifier value was already associated with the session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34356835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com