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áš