i’m trying to validate a new bean object using the jpa validation.
I’m getting this error:
2012-09-24 11:19:55,584 WARN [AbstractModel:32] The object is not persisted yet, this operation requires the object to already be persisted.
java.lang.Exception
at org.oscarehr.common.model.AbstractModel.hashCode(AbstractModel.java:32)
at org.hibernate.validator.engine.ConstraintViolationImpl.hashCode(ConstraintViolationImpl.java:127)
at java.util.HashMap.put(HashMap.java:389)
at java.util.HashSet.add(HashSet.java:217)
at java.util.AbstractCollection.addAll(AbstractCollection.java:322)
at java.util.HashSet.<init>(HashSet.java:117)
at org.hibernate.validator.engine.ValidatorImpl.validate(ValidatorImpl.java:120)
at org.apache.jsp.billing.CA.ON.reports.billingONNewReport_jsp.saveSubmittedBills(billingONNewReport_jsp.java:383)
at org.apache.jsp.billing.CA.ON.reports.billingONNewReport_jsp._jspService(billingONNewReport_jsp.java:796)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709)
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680)
at org.apache.jsp.billing.CA.ON.billingONReport_jsp._jspService(billingONReport_jsp.java:109)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
....
I’m using:
hibernate-entitymanager 3.4.0.GA
hibernate-validator 4.1.0.Final
validation-api 1.0.0.GA
I’m calling my validation code like this:
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<BillingClaimHeader1>> constraintViolations = validator.validate(newBill);
MiscUtils.getLogger().info("num violations: " + constraintViolations.size());
Where newBill is a new instance of class BillingClaimHeader1.
Here’s the class definition for BillingClaimHeader1:
public class BillingClaimHeader1 extends AbstractModel<Integer> implements Serializable
I’m pretty new to the whole JPA/validation thing, but I didn’t realize that I had to persist an object BEFORE validating it…seems kind of counter-intuitive..
I appreciate any help!
cheers
Jarrett
Note that
org.oscarehr.common.model.AbstractModel, not JPAActually, you can safely ignore this message in your case.
org.oscarehr.common.model.AbstractModeluses entity identifier to implementequals()andhashCode(). This approach has one disadvantage when used with generated identifiers – it breaks the contract ofequals()andhashCode()when you save an object, i.e.hashCode()of a transient object differs fromhashCode()of the same object after you saved it.To inform you about possible problems authors of
org.oscarehr.common.model.AbstractModeldecided to emit a warning when you callhashCode()on a transient object. However, in your case you can safely ignore this warning, becausehashCode()is called internally by validation routines that operate on transient objects only (as far as I understand).See also: