ho un'entità con un nome di campo, e voglio che sia non più lungo di 255, così ho definito in questo modo:Come posso convalidare vincoli su entità durante persistere di un'entità in ibernazione
@Entity
public class A implements Serializable {
...
@NotNull
@Size(max=255)
private String name;
Voglio che venga convalidato come chiamo a.persist(), in modo che se il nome è troppo lungo viene lanciata un'eccezione.
ho HibernateValidator definito 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>
Eppure non funziona. Non viene generata alcuna eccezione durante la permanenza e solo durante il commit, quando il gestore dell'entità viene svuotato, ottengo un'eccezione e anche in questo caso si tratta di un'eccezione dal database (perché anch'essa ha una limitazione sulla colonna con la dimensione 255). Quindi credo che la mia convalida non stia funzionando affatto.
Quindi sarei felice se mi hai aiutato con queste due domande: 1) Come far accadere la convalida durante il persistere e non durante filo 2) come causa la convalida di gettare eccezioni quando la validazione fallisce?
Grazie, aiuta, ora avviene la convalida, ma accade durante lo svuotamento (che potrebbe non succedere finché non commetto), non durante il persistere. C'è un modo per farlo accadere quando chiamo persist()? –
Penso che questo sia un comportamento normale perché il tuo ID è assegnato solo quando si scarica una sessione e questo è effettivamente lo stadio in cui Hibernate persiste gli oggetti. –
Ecco fatto. A "persist()" non procede alla validazione(). Solo se scarichi() o impegni la tua transazione, convaliderà i tuoi bean. Quindi faccio prima un persist() e poi un flush() – flipperweid