2012-01-11 9 views
5

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?

Odpowiedz

4

Można użyć Hibernate validator.

należy włączyć funkcje aktualizacji wstępnej i wstępnej dla BeanValidationEventListener.

możesz przeczytać więcej na ten temat here i here.

Mam nadzieję, że to pomaga.

+0

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()? –

+0

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

+0

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

Powiązane problemy