2012-09-24 37 views
0

我想驗證使用jpa驗證的新bean對象。jpa驗證分離的對象

我得到這個錯誤:

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) 
.... 

我使用:

hibernate-entitymanager 3.4.0.GA 
hibernate-validator 4.1.0.Final 
validation-api 1.0.0.GA 

我打電話給我的驗證代碼:

Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); 
       Set<ConstraintViolation<BillingClaimHeader1>> constraintViolations = validator.validate(newBill); 
       MiscUtils.getLogger().info("num violations: " + constraintViolations.size()); 

哪裏newBill是類別BillingClaimHeader1的新實例。

這裏的類定義BillingClaimHeader1

public class BillingClaimHeader1 extends AbstractModel<Integer> implements Serializable 

我是很新,整個JPA /驗證的事情,但我不知道,我不得不堅持一個對象之前驗證它...似乎有點反直覺..

我感謝任何幫助!

歡呼

賈勒特

回答

1

注意

  1. 此消息來自org.oscarehr.common.model.AbstractModel,而不是JPA
  2. 這是一個警告,而不是錯誤

其實,你可以放心地忽略你的情況這條消息。

org.oscarehr.common.model.AbstractModel使用實體標識符來實現equals()hashCode()。這種方法與生成的標識符一起使用時有一個缺點 - 當您保存一個對象時,它將打破equals()hashCode()的合約,即在保存對象後,瞬變對象的hashCode()與同一對象的hashCode()不同。

要通知您有關org.oscarehr.common.model.AbstractModel的作者可能出現的問題,當您對暫態對象調用hashCode()時,決定發出警告。但是,在你的情況下,你可以放心地忽略這個警告,因爲hashCode()是由驗證程序在內部調用的,這些程序僅對瞬態對象進行操作(據我所知)。

參見:

+0

呵呵,是啊,這是有道理的:)謝謝@axtavt! – Jarrett

0

你的實體與PersistenceContext分離。您必須爲該實例執行manage state