3
When I will edit a reservation I get this error in the console:
A Different Object with the same Identifier value was already Associated with the Session : [br.com.blumar.events.model.Route#3883]
Here’s my Reserve class (which I want to edit):
package br.com.blumar.events.model;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import br.com.blumar.events.model.enumeration.EPaymentStatus;
import br.com.blumar.events.model.enumeration.EReservationOrigin;
@Entity
@Table(name = "transfer_reservation_new")
@SequenceGenerator(name = "seq", sequenceName = "events.transfer_reservation_new_id_seq")
public class TransferReservation implements Serializable {
  private static final long serialVersionUID = -4130238319014109932 L;
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "seq")
  private Integer id;
  private String name;
  private String email;
  @ManyToOne
  @JoinColumn(name = "event_id")
  private Event event;
  @ManyToOne
  @JoinColumn(name = "reservation_status_id")
  private ReservationStatus reservationStatus;
  @Column(name = "creation_date", insertable = false, updatable = false)
  private Date creationDate;
  @ManyToOne
  @JoinColumn(name = "country_id")
  private Country country;
  @OrderBy("date ASC")
  @OneToMany(mappedBy = "transferReservation", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<Route>routeList;
  @OneToMany(mappedBy = "transferReservation", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<TransferReservationPayment>paymentList;
  @OneToMany(mappedBy = "transferReservation", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<TransferReservationReversal>reversalList;
  @ManyToOne
  @JoinColumn(name = "currency_id")
  private Currency currency;
  @Column(name = "reservation_origin_id")
  private Integer reservationOrigin = EReservationOrigin.SITE.getId();
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public Event getEvent() {
    return event;
  }
  public void setEvent(Event event) {
    this.event = event;
  }
  public List<Route>getRouteList() {
    return routeList;
  }
  public void setRouteList(List<Route>routeList) {
    this.routeList = routeList;
  }
  public ReservationStatus getReservationStatus() {
    return reservationStatus;
  }
  public void setReservationStatus(ReservationStatus reservationStatus) {
    this.reservationStatus = reservationStatus;
  }
  public Date getCreationDate() {
    return creationDate;
  }
  public void setCreationDate(Date creationDate) {
    this.creationDate = creationDate;
  }
  public Country getCountry() {
    return country;
  }
  public void setCountry(Country country) {
    this.country = country;
  }
  public List<TransferReservationPayment>getPaymentList() {
    return paymentList;
  }
  public void setPaymentList(List<TransferReservationPayment>paymentList) {
    this.paymentList = paymentList;
  }
  public List<TransferReservationReversal>getReversalList() {
    return reversalList;
  }
  public void setReversalList(List<TransferReservationReversal>reversalList) {
    this.reversalList = reversalList;
  }
  public Integer getReservationOrigin() {
    return reservationOrigin;
  }
  public void setReservationOrigin(Integer reservationOrigin) {
    this.reservationOrigin = reservationOrigin;
  }
  public Double getTotalPrice() {
    Double totalPrice = new Double(0);
    for (Route route: this.getRouteList())
      totalPrice += route.getPrice();
    return totalPrice;
  }
  public Currency getCurrency() {
    return currency;
  }
  public void setCurrency(Currency currency) {
    this.currency = currency;
  }
  public boolean isOnlyOnePaymentConfirmed() {
    int confirmedPaymentQtt = 0;
    for (TransferReservationPayment payment: paymentList) {
      if (payment.getPaymentStatus().getId().equals(EPaymentStatus.PAID.getId()))
        confirmedPaymentQtt++;
    }
    return confirmedPaymentQtt == 1;
  }
  public TransferReservationPayment getPaymentConfirmed() {
    for (TransferReservationPayment payment: paymentList) {
      if (payment.getPaymentStatus().getId().equals(EPaymentStatus.PAID.getId()))
        return payment;
    }
    return null;
  }
  public boolean isAtLeastOneCreditcardPaymentConfirmed() {
    for (TransferReservationPayment payment: paymentList) {
      if (payment.getPaymentStatus().getId().equals(EPaymentStatus.PAID.getId()) &&
        (payment instanceof TransferReservationCreditcardPayment ||
          payment instanceof TransferReservationCharginglinkPayment))
        return true;
    }
    return false;
  }
  public Double getTotalPayment() {
    BigDecimal total = new BigDecimal(BigInteger.ZERO);
    for (TransferReservationPayment payment: this.getPaymentList()) {
      if (payment.getPaymentStatus().getId().equals(EPaymentStatus.PAID.getId()))
        total = total.add(BigDecimal.valueOf(payment.getValue()));
    }
    return total.doubleValue();
  }
  public Double getTotalReversal() {
    BigDecimal total = new BigDecimal(BigInteger.ZERO);
    for (TransferReservationReversal reversal: this.getReversalList())
      if (reversal.getNetValue() != null)
        total = total.add(BigDecimal.valueOf(reversal.getNetValue()));
    return total.doubleValue();
  }
}
And here is my class of Rota (which is apparently making a mistake):
package br.com.blumar.events.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import br.com.blumar.events.model.enumeration.EAdditionalInfo;
@Entity
@Table(name = "route")
@SequenceGenerator(name = "seq", sequenceName = "events.route_id_seq")
public class Route implements Serializable {
  private static final long serialVersionUID = 2132155173071197885 L;
  @Id
  @GeneratedValue(generator = "seq", strategy = GenerationType.IDENTITY)
  private Integer id;
  @ManyToOne
  @JoinColumn(name = "transfer_reservation_id")
  private TransferReservation transferReservation;
  @ManyToOne
  @JoinColumn(name = "id_from")
  private TransferLocal from;
  @ManyToOne
  @JoinColumn(name = "id_to")
  private TransferLocal to;
  private Double price;
  @Column(name = "pax_number")
  private Integer paxNumber;
  @OneToMany(mappedBy = "route", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<AgeChd>ageChdList;
  @Column(name = "special_needs")
  private String specialNeeds;
  private String observation;
  @ManyToOne
  @JoinColumn(name = "transportation_id")
  private Transportation transportation;
  @OneToMany(mappedBy = "route", cascade = CascadeType.ALL, orphanRemoval = true)
  private List<AdditionalInfo>addtionalInfoList;
  private String hour;
  private Date date;
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public TransferReservation getTransferReservation() {
    return transferReservation;
  }
  public void setTransferReservation(TransferReservation transferOptionReservation) {
    this.transferReservation = transferOptionReservation;
  }
  public TransferLocal getFrom() {
    return from;
  }
  public void setFrom(TransferLocal from) {
    this.from = from;
  }
  public TransferLocal getTo() {
    return to;
  }
  public void setTo(TransferLocal to) {
    this.to = to;
  }
  public Double getPrice() {
    return price;
  }
  public void setPrice(Double price) {
    this.price = price;
  }
  public Integer getPaxNumber() {
    return paxNumber;
  }
  public void setPaxNumber(Integer paxNumber) {
    this.paxNumber = paxNumber;
  }
  public List<AgeChd>getAgeChdList() {
    return ageChdList;
  }
  public void setAgeChdList(List<AgeChd>ageChdList) {
    this.ageChdList = ageChdList;
  }
  public String getSpecialNeeds() {
    return specialNeeds;
  }
  public void setSpecialNeeds(String specialNeeds) {
    this.specialNeeds = specialNeeds;
  }
  public String getObservation() {
    return observation;
  }
  public void setObservation(String observation) {
    this.observation = observation;
  }
  public Transportation getTransportation() {
    return transportation;
  }
  public void setTransportation(Transportation transportation) {
    this.transportation = transportation;
  }
  public List<AdditionalInfo>getAddtionalInfoList() {
    return addtionalInfoList;
  }
  public void setAddtionalInfoList(List < AdditionalInfo > addtionalInfoList) {
    this.addtionalInfoList = addtionalInfoList;
  }
  public Integer getTotalPaxNumber() {
    return this.getPaxNumber() + this.getPaxNumberChd();
  }
  public Integer getPaxNumberChdToPay() {
    Integer paxNumberChdToPay = 0;
    if ((this.getAgeChdList() != null) && (!this.getAgeChdList().isEmpty()))
      for (AgeChd age: this.getAgeChdList())
        if (age != null && age.getAge() > 2)
          paxNumberChdToPay += 1;
    return paxNumberChdToPay;
  }
  public Integer getPaxNumberChd() {
    return this.getAgeChdList() == null ? 0 : this.getAgeChdList().size();
  }
  public String getHour() {
    return hour;
  }
  public void setHour(String hour) {
    this.hour = hour;
  }
  public Date getDate() {
    return date;
  }
  public void setDate(Date date) {
    this.date = date;
  }
  public AdditionalInfo getInfoByType(EAdditionalInfo type) {
    for (AdditionalInfo additionalInfo: this.addtionalInfoList)
      if (additionalInfo.getType().equals(type.getId()))
        return additionalInfo;
    return new AdditionalInfo();
  }
}
It is worth mentioning that I am already using the session.clear() before changing and seems not to be this.
It is worth mentioning that I am already using Session.clear(); before changing and it seems not to be this.
– user63513
Without understanding the context of your question, I believe it will be a little more difficult to get a clear and objective answer, I could try to explain in words what should happen.
– MarceloBoni
Show the code used to load the entity, edit it and save.
– Dherik