Szymon Błądek

Szymon Błądek Software Engineer at
I-BS.PL

Temat: JPA i czas

Witam,
Od jakiegos czasu zastanawiam sie czy mozliwe jest zapisanie w bazie Entity, ktore sklada sie z daty przy czym chec zeby ta data byla wypelniona funkcja sql np. now(), current_time. Np.
create table test {
id integer,
czas timestamp without time zone);

Insert into test values (1,now());

i teraz mam klase
@Entity
@Table(name = "test")
Class Test {
@Column(name = "test")
private Integer id;
@Column(name = "czas")
@Temporal(TemporalType.TIMESTAMP)
private Date czas;

sety i gety }

No i jak to teraz wypelnic zeby wykonanie na tym persist dalo efekt jak insert powyzej (czas pobrany z silnika bazy)

konto usunięte

Temat: JPA i czas

Nie wiem czy Twoja baza daną funkcję obsługuje lub czy Twoje założenia są spełnione, ale kilka koncepcji:
1) do obiektu DAO w metodzie zapisującej dodaj czas = new Date();
2) dodaj do bazy default value dla kolumny w postaci funkcji now()
3) dodaj triggera, który będzie automatycznie ustawiał datę.

opcje 2 i 3 mogą wymagać refresha na obiekcie. Ew. opcja 2 nie zadziała wcale, bo JPA wymusi zapisanie nulla.

Generalnie nie jestem specjalistą od JPA, ale może coś pomogłem;)

konto usunięte

Temat: JPA i czas

Szymon Błądek:
Witam,
Od jakiegos czasu zastanawiam sie czy mozliwe jest zapisanie w bazie Entity, ktore sklada sie z daty przy czym chec zeby ta data byla wypelniona funkcja sql np. now(), current_time. Np.
create table test {
id integer,
czas timestamp without time zone);

Insert into test values (1,now());

i teraz mam klase
@Entity
@Table(name = "test")
Class Test {
@Column(name = "test")
private Integer id;
@Column(name = "czas")
@Temporal(TemporalType.TIMESTAMP)
private Date czas;

sety i gety }

No i jak to teraz wypelnic zeby wykonanie na tym persist dalo efekt jak insert powyzej (czas pobrany z silnika bazy)

Poto masz ORM żeby własnie nie pisać samemu Insert into test values (1,now());.

Zrobiłeś sobie klase encji Test. Robie z tego obiekt Test test = new Test();
ustawiasz pola test.setId(1); i test.setCzas(new Date()); i w podajesz do zapisania przez entity managera (EntityManager em) em.persist(test); i po sprawie. Dzieki temu wstawi Ci sie rekord z aktualna data (new Date() tworzy obiekt z czasem w ktorym zostal stworzony).

Mam nadzieje ze o to Ci chodzilo.
Szymon Błądek

Szymon Błądek Software Engineer at
I-BS.PL

Temat: JPA i czas

no ok i tak robie sobie z new Date(); tylko ze to dalej pobierze mi czas z maszyny na ktorej uruchomiony zostal program. A mi chodzi o pobranie czasu z serwera bazy danych. Chodzi o to ze mam kilka aplikacji korzystajacej ze wspolnej bazy (np wspolna tabela logu). I teraz
Program 1 uruchomiony na serwerze 1 wpisuje inserta w jdbc z wykorzystaniem funkcji now() serwera bazy danych
program 2 uruchomiony na serwerze 2 wpisuje obiekt do bazy za pomoca jpa z czasem lokalnym serwera 2.
Czyli teraz nie mozna jednoznacznie okreslic czy program 1 czy program 2 zapisal dane do bazy jako pierwszy (bo np czas na serwerze 2 jest zle ustawiony i ma czas cofniety o 2h)
Sebastian Kolski

Sebastian Kolski programista/DBA

Temat: JPA i czas

Wydaje mi się, że masz takie możliwości:
1) Tak jak napisał Darek, trigger w bazie na before insert, ale wiadomo triggery to ZŁO. Plus musisz robić refresh'a z upewnieniem się, że dane zostaną odczytane z bazy, a nie z jakiegoś cache ORM'a.
2) Annotacja kolumny insertable=false i ustawienie default na poziomie tabeli. Konieczny refresh jak wyżej.
3) Stworzenie metody @PrePersist, w niej wyciągnięcie z bazy aktualnego czasu i wstawienie w pole. Nie musisz refreshować, ale musisz wyciągać z bazy.

Jeśli konieczna jest maksymalna dokładność to musi to być robione na poziomie bazy (czyli 1 lub 2).
Jeśli dokładność 3 jest do przyjęcia, ja bym tego użył, także dlatego, że jest tu miejsce na, prawdopodobnie niepotrzebną optymalizację :P, polegającą na obliczeniu różnicy czasów lokalnego i bazy danych przy starcie klienta i rezygnację z odpytywania bazy w @PrePersist.

Dodatkowo pytanie czy w aplikacji jest używane później to pole (łatwo sobie można wyobrazić sytuację, że nie). Jeśli nie, to najlepiej by było użyć 2 i całkowicie zrezygnować z mapowania tej kolumny w obiekcie.
Łukasz Wójcik

Łukasz Wójcik Programista baz
danych/aplikacji
web/ student UJ

Temat: JPA i czas

Może to też pomoże :
"3.4.10. Custom SQL for CRUD operations"
na
http://www.redhat.com/docs/en-US/JBoss_Enterprise_Appl...
Nie korzystałem z tego, ale skojarzyłem, że gdzieś to widziałem
Jeżeli nie korzystasz z HBN - to może jest analogiczne rozszerzenie w Twojej bibliotece JPAŁukasz Wójcik edytował(a) ten post dnia 20.11.09 o godzinie 23:13

Następna dyskusja:

JPA - zapytania składane




Wyślij zaproszenie do