CustomerSurvey.java
public class CustomerSurvey
implements Serializable
{
/**
*
*/
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CUSTOMER_SURVEY_SEQUENCE") @Column(name = "SURVEYID", nullable = false) private String surveyId;
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "CUSTNO", referencedColumnName = "CustNO") private Customer customer;
@Column(name = "AVGRATINGS") private double avgRatings;
@Column(name = "COMMENTS") private String comments;
@Column(name = "SENTON") private Date sentOn;
@Column(name = "RESPONDEDON") private Date respondedOn;
@Column(name = "RESPONDED") int responded;
@Basic(fetch = FetchType.EAGER) @OneToMany(mappedBy = "customerSurvey", cascade = CascadeType.ALL) private Set<SurveyResponse> responses;
@XmlTransient @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.DETACH) @JoinColumn(name = "SRNO") private ServiceRequest serviceRequest;
@Column(name = "ATTACHMENT") @Lob @Basic(fetch = FetchType.EAGER) private byte[] attachment;
--- getters and setters---
public int hashCode()
{
return new HashCodeBuilder(17,31)
.append(this.surveyId)
// .append(this.avgRatings)
// .append(this.getResponded())
.toHashCode();
}
@Override
public boolean equals(Object obj)
{
return new EqualsBuilder().
append("SurveyId",this.surveyId)
// .append("responded", this.getResponded())
// .append("AvgRatings", this.getAvgRatings())
.isEquals();
}
Persistence Code:
public void submitSurveyResponse(List surveys)
throws WorkServiceException
{
if ( this.entityManagerFactory == null )
{
this.entityManagerFactory = this.getEntityManagerFactory();
}
EntityManager em = this.entityManagerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
for (CustomerSurvey survey : surveys)
{
tx.begin();
survey.setRespondedOn(Calendar.getInstance().getTime());
survey.setResponded(BooleanResponse.YES.getCode());
survey.setCustomer(em.find(Customer.class, survey.getCustomer().getCustNo().trim()));
survey.setComments("Survey Response submitted");
for (SurveyResponse response : survey.getResponses())
{
response.setQuestionair(em.find(Questionair.class, response.getQuestionair().getqNo()));
}
CustomerSurvey cs = em.find(CustomerSurvey.class, survey.getSurveyId());
System.out.println(survey.equals(cs));
Query query1 = em.createQuery("SELECT from CustomerSurvey customerSurvey where customerSurvey.surveyId = :id")
.setParameter("id", survey.getSurveyId());
CustomerSurvey dbSurvey = (CustomerSurvey) query1.getResultList().get(0);
System.out.println(":" + survey.equals(dbSurvey));
if(survey.getServiceRequest() == null) {
cs = em.find(CustomerSurvey.class, survey.getSurveyId());
survey.setServiceRequest(cs.getServiceRequest());
}
CustomerSurvey mSurvey = em.merge(survey);
String surveyId = mSurvey.getSurveyId();
Query query = em.createNamedQuery("surveyResponse.getAverageRatings");
logger.trace(query.toString());
query.setParameter("surveyId", surveyId);
logger.trace(query.toString());
Double avgRating = (Double) query.getSingleResult();
if ( avgRating == null )
{
avgRating = new Double(0);
}
BigDecimal bd = BigDecimal.valueOf(avgRating);
bd = bd.setScale(2, RoundingMode.HALF_UP);
avgRating = bd.doubleValue();
mSurvey.setAvgRatings(avgRating);
em.flush();
tx.commit();
}
em.clear();
em.close();
}
It does not update , instead it inserts new row.
After using hashcode builder and equals builder I get false for folloing check:
The test for System.out.println(“:” + survey.equals(dbSurvey)); gives false
The test for System.out.println(survey.equals(cs));
above gives false.
please advice
“transient” and “detached” are different states and will have different behaviour in merge() as per the JPA spec. transient will create a new object. detached with update an existing. Either obtain a detached object before modifying it, or read the section “Detachment” on http://www.datanucleus.org/products/accessplatform_3_2/jpa/object_lifecycle.html