Próbuję sprawdzić poprawność nowego obiektu fasoli przy użyciu walidacji jpa.
Otrzymuję ten błąd:
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)
....
Używam:
hibernate-entitymanager 3.4.0.GA
hibernate-validator 4.1.0.Final
validation-api 1.0.0.GA
Wywołuję swój kod weryfikacyjny w ten sposób:
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<BillingClaimHeader1>> constraintViolations = validator.validate(newBill);
MiscUtils.getLogger().info("num violations: " + constraintViolations.size());
Gdzie newBill
jest nową instancją klasy BillingClaimHeader1
.
Oto definicja klasy dla BillingClaimHeader1
:
public class BillingClaimHeader1 extends AbstractModel<Integer> implements Serializable
Jestem całkiem nowy w całej sprawie JPA/walidacji, ale nie zdawałem sobie sprawy, że muszę utrzymywać obiekt PRZED jego walidacją... wydaje się to trochę sprzeczne z intuicją..
Doceniam każdą pomoc!
Twoje zdrowie
Jarrett.
2 odpowiedzi
Zwróć na to uwagę
- Ta wiadomość pochodzi z
org.oscarehr.common.model.AbstractModel
, a nie z JPA - To ostrzeżenie, a nie błąd
Właściwie możesz bezpiecznie zignorować tę wiadomość w swoim przypadku.
org.oscarehr.common.model.AbstractModel
używa identyfikatora jednostki do implementacji equals()
i hashCode()
. To podejście ma jedną wadę, gdy jest używane z wygenerowanymi identyfikatorami - zrywa kontrakt equals()
i hashCode()
podczas zapisywania obiektu, tj. hashCode()
obiektu przejściowego różni się od hashCode()
tego samego obiektu po zapisaniu.
Aby poinformować Cię o możliwych problemach autorzy org.oscarehr.common.model.AbstractModel
postanowili emitować ostrzeżenie, gdy wywołujesz hashCode()
na obiekcie przejściowym. Jednak w twoim przypadku możesz bezpiecznie zignorować to ostrzeżenie, ponieważ hashCode()
jest wywoływane wewnętrznie przez procedury sprawdzania poprawności, które działają tylko na obiektach przejściowych (o ile rozumiem).
Zobacz także:
Twoja jednostka jest odłączona od PersistenceContext
. Musisz zrobić manage state
dla tej instancji.
Podobne pytania
Nowe pytania
java
Java to język programowania wysokiego poziomu. Użyj tego tagu, jeśli masz problemy z używaniem lub zrozumieniem samego języka. Ten tag jest rzadko używany samodzielnie i jest najczęściej używany w połączeniu z [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] i [maven].