2015-12-18 2 views
1

Я использую итерацию для сохранения всех объектов в коллекции. Тогда у меня есть эта проблема. Я пробовал persist() и merge(), но похоже, что идентификатор объектов никогда не менялся. Буду признателен, если кто-нибудь сможет помочь.Как решить javax.persistence.EntityExistsException: другой объект с тем же значением идентификатора уже был связан с сеансом

мой дао

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

мой Order.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 

заранее.

+0

Здравствуйте, пользователь Eclipse ... вы всегда поддерживаете «TODO Auto-generated method stub» в вашем коде, даже если вы внедрили метод? – Roel

ответ

0

Пока я не имею SaleOrder класс, чтобы увидеть, я полагаю, две вещи:

1) Тип id струнный и инициализируется «». В этом случае не забудьте инициализировать его до нуля

2) Тип id - это int или первичный тип. В этом случае я предлагаю изменить его на тип объекта, например Integer, а затем инициализировать его нулевым.

+0

Спасибо за ваш ответ. Я редактировал свой пост и добавлен класс SaleOrder. Пожалуйста, проверьте его снова thx ~ :) – Gnostikoi

Смежные вопросы

 Смежные вопросы