Mam podmiot z nazwy pola, i chcę go mieć nie więcej niż 255, więc zdefiniowane tak:Jak mogę potwierdzić ograniczenia co o podmiotach podczas utrzymują podmiotu w hibernacji
@Entity
public class A implements Serializable {
...
@NotNull
@Size(max=255)
private String name;
Chcę to sprawdzić, jak nazywam a.persist(), więc jeśli nazwa jest zbyt długa, wyjątek jest zgłaszany.
Mam HibernateValidator zdefiniowane w validation.xml:
<?xml version="1.0" encoding="UTF-8"?>
<validation-config
xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration validation-configuration-1.0.xsd">
<default-provider>org.hibernate.validator.HibernateValidator</default-provider>
<message-interpolator>org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator</message-interpolator>
<traversable-resolver>org.hibernate.validator.engine.resolver.DefaultTraversableResolver</traversable-resolver>
<constraint-validator-factory>org.hibernate.validator.engine.ConstraintValidatorFactoryImpl</constraint-validator-factory>
</validation-config>
Ale to nie działa. Podczas trwałości nie jest zgłaszany wyjątek i tylko podczas zatwierdzania, gdy menadżer encji jest przepłukiwany, otrzymuję wyjątek, a nawet wtedy jest to wyjątek z bazy danych (ponieważ ma on również ograniczenie dla kolumny o rozmiarze 255). Uważam więc, że moja walidacja w ogóle nie działa.
Więc byłbym zadowolony, jeśli mi pomógł z tymi dwoma pytaniami: 1) jak zrobić walidacja zdarzyć podczas utrzymywać, a nie podczas równo 2) w jaki sposób spowodować, że walidacja rzucać wyjątki gdy walidacja nie powiedzie?
Dzięki! Pomaga, teraz walidacja dzieje się, ale dzieje się to podczas spłukiwania (co może się zdarzyć dopiero po zatwierdzeniu), a nie podczas utrzymywania. Czy istnieje sposób, aby to się stało, gdy wywołuję persist()? –
Myślę, że to normalne zachowanie, ponieważ twój identyfikator jest przypisany tylko wtedy, gdy opróżnisz sesję i jest to faktycznie etap, na którym Hibernacja utrzymuje twoje obiekty. –
To to. W "persist()" nie przechodzi walidacja(). Tylko wtedy, gdy opróżnisz() lub zatwierdzisz transakcję, potwierdzisz swoje ziarna. Tak więc najpierw robię persist(), a potem kolor() – flipperweid