0

JPA検証を使用して新しいBeanオブジェクトを検証しようとしています。

次のエラーが表示されます。

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());

newBillclass の新しいインスタンスはどこにありますかBillingClaimHeader1

のクラス定義は次のBillingClaimHeader1とおりです。

public class BillingClaimHeader1 extends AbstractModel<Integer> implements Serializable

私はJPA /検証全体にかなり慣れていませんが、検証する前にオブジェクトを永続化する必要があることに気づきませんでした...ちょっと直感に反するようです..

どんな助けにも感謝します!

乾杯

ジャレット

4

2 に答える 2

1

ご了承ください

  1. このメッセージはorg.oscarehr.common.model.AbstractModel、JPA ではなくから送信されます
  2. エラーではなく警告です

実際、このメッセージは無視しても問題ありません。

org.oscarehr.common.model.AbstractModelはエンティティ識別子を使用して と を実装equals()hashCode()ます。このアプローチには、生成された識別子を使用する場合に 1 つの欠点があります。つまり、オブジェクトを保存するとき、つまり、保存した後の同じオブジェクトequals()とは異なる一時オブジェクトの契約が破られます。hashCode()hashCode()hashCode()

発生する可能性のある問題について通知するために、 の作成者は、一時的なオブジェクトorg.oscarehr.common.model.AbstractModelを呼び出したときに警告を発することにしました。hashCode()ただし、この警告は安全に無視できます。これhashCode()は、一時オブジェクトのみを操作する検証ルーチンによって内部的に呼び出されるためです (私が理解している限り)。

以下も参照してください。

于 2012-09-24T15:59:16.960 に答える
0

エンティティはで切り離されていPersistenceContextます。あなたはmanage stateそのインスタンスのためにやらなければなりません。

于 2012-09-24T15:46:52.933 に答える