IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Spring/JPA/Thymeleaf - Jak NEaktualizovat datum u Entity?

Aktivity
Avatar
Navry
Člen
Avatar
Navry:6.8.2018 10:06

Mám entitu, která má mimo jiné atributy 'dateCreated' a 'dateUpdated'. Nevím jak udělat to, že když upravuji entitu pomocí klasického formuláře, tak aby 'dateCreated' zůstalo stejné.

Datum ve formuláři nijak nezadávám.

Používám šablonovací systém Thymeleaf.

Nevím jestli dělám chybu čistě v Javě nebo dělám něco špatně v Thymeleafu?

Zkusil jsem: Zkoušel jsem si vypsat 'dateCreated' po načtení z DB a před zobrazením editačního formuláře a to je normálně v pořádku. Po odeslání editačního formuláře už je to změněno.

Aby mě fungovala editace entity tak jsem musel do formuláře dát:

<input type="hidden" th:field="*{entita.idEntity}">

protože jinak se ID neuložilo, po odeslání formuláře se nastavilo nové a pak při 'repository.save()' se vytvořila nová entita místo úpravy existující.

Tak jsem zkusil to samý s tím datem, přidal jsem:

<input type="hidden" th:field="*{entita.dateCreated}">

Aby si to pamatovalo a nevytvářelo nový. Ale to nefunguje protože,pak při odeslání formuláře dostanu 'Validation failed'.

Jinak u tý entity mám klasický gettery/settery a 2 konstruktory:
1.

public Entita() {
        super();
        this.dateCreated = new Date();
        this.dateUpdated = new Date();
}

2.

public Entita(..., Date dateCreated) {
        super();
        ...
        this.dateCreated = dateCreated;
        this.dateUpdated = new Date();
}

Chci docílit: Aby po úpravě entity zůstalo 'dateCreated' stejné.

 
Odpovědět
6.8.2018 10:06
Avatar
Odpovídá na Navry
Matúš Olejník:6.8.2018 14:33

Nerobím s Thymeleafom, ale s akým dátumom sa ti to prepíše?

Nahoru Odpovědět
6.8.2018 14:33
/* I am not sure why this works but it fixes the problem */
Avatar
Navry
Člen
Avatar
Odpovídá na Matúš Olejník
Navry:6.8.2018 16:59

Přepíše se to aktuálním časem a datem.

 
Nahoru Odpovědět
6.8.2018 16:59
Avatar
Odpovídá na Navry
Matúš Olejník:6.8.2018 19:35

Nerobíš niečo, čo by to mohlo prepísať ešte pred uložením alebo v nejakom setteri omylom zapisuješ do inej premennej než chceš?

Nahoru Odpovědět
6.8.2018 19:35
/* I am not sure why this works but it fixes the problem */
Avatar
Navry
Člen
Avatar
Navry:9.8.2018 9:55

Settery jsou správně a já je ručně prakticky nikde nepoužívám. Problém nastává po úpravě entity v editačním formuláři a po odeslání toho formuláře. Když si na začátku metody, která zpracovává ten formulář vypíšu ten datum tak už je změněný.

Jinak pro zobrazení stránky s formulářem používám 'ModelAndView', kde jako 'modelObject' předávám třídu formuláře, která má jako jeden z atributů tu danou entitu, kterou ve formuláři upravuju.
V Metodě pro zpracování formuláře mám jako parametr tu třídu formuláře s anotací '@ModelAttribute' a pak si přez getter vezmu tu entitu z formuláře a dál s ní pracuju.

Asi bude problém někde v tom, jak se z toto formuláře vytvoří ten objekt, kterej pak dostanu v tý metodě? Nevim jak přesně to funguje a nevim jestli to je záležitost přímo Springu nebo Thymeleafu.

Myslím si, že budu muset prostě nějak do toho formuláře dát ten datum aby si to pak vzalo z něj.

 
Nahoru Odpovědět
9.8.2018 9:55
Avatar
Navry
Člen
Avatar
Navry:9.8.2018 10:15

Tak problém vyřešen.

Ve formuláři musím mít normálně:

<input type="hidden" th:field="*{entita.dateCreated}">

A ve třídě entity jsem musel přidat anotaci s formátem, který odpovídá té hodnotě, která se zobrazí v tom hidden inputu (Když jsem si to zobrazil pomocí prohlížeče).

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss.SSS")
private Date dateCreated;

Teď už to funguje a při odeslání formuláře nedostávám žádný 'Validation failed'.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět
9.8.2018 10:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.