Dobrý den

mám následující problém, který se vyskytne při validaci formulářů ve
webové aplikací, která používá Spring, Struts2, Jpa(Hibernate). 

Mám DAO třídu (service), která používá EntityManagera a transakce
(@Transactional). Abych mohl načítat asociované objety ve view vrstvě,
mám ve web.xml registrovaný filtr OpenEntityManagerInViewFilter.


1. Vyplním formulář a odešlu na StrutsAction.java  

        //pole ve formuláři
        <input type="hidden" name="article.id" value="2" />   
        <input name="article.title" />
    
2. Ve tříde StrutsAction se mi podle article.id natáhne z db entita a
přes set metodu se do ní vloží titulek (Article.title)

//načtení entity z db   
//a asi start transakce
if (article != null && article.getId() != null)
            article = service.find(article.getId());


3. Spustí se validační interceptor, který kontroluje délku stringu
titulku (schválně jsem ho zadal delší než je povolené) a protože titulek
je delší vrací mě na formulář. Metoda save která obsahuje
"service.save(article);" se nespustí což je v pořádku.

    @ValidujDelku
    public String save() throws Exception{                     
        service.save(article);
        return SUCCESS;
    }


Problém(aneb co si myslím, že se děje):

4. Před tím než OpenEntityManagerInViewFilter uzavře transakci zavolá
metodu flush a synchronizuje objekt Article načtený ve StrutsAction s
DB. (Objekt Article obsahuje pole title s přesahující délkou pole)

5. Hibernate mi vyhodí vyjímku
BatchUpdateException: Data truncation: Data too long for column 'title'
at row 1

Problém tedy vidím v automatické synchronizaci objektu Article. ???
FlushModeType.AUTO

Stále se v tom hrabu a nemůžu přijít na to kde, co a jak změnit.
Děkuju za radu.
Tomáš

Odpovedet emailem