2012-01-23 7 views
7

Pracuję nad utworzeniem zestawu zgodności adnotacji JPA 2.0 dla mojego stażu. W tej chwili zastanawiam się, kiedy adnotacja @MapKeyTemporal jest wymagana i kiedy jest opcjonalna ...Jaki jest domyślny typ TemporalType dla tymczasowego klucza mapy bez adnotacji @MapKeyColumn lub @MapKeyTemporal?

Wiem, że gdy definiujesz kolumnę klucza mapy za pomocą @MapKeyColumn, typ klucza powinien być odwzorowany na można wyprowadzić, patrząc na typ kolumny (a poza tym na typ w columndefinition). Dlatego w tym przypadku adnotacja @MapKeyTemporal nie jest konieczna.

Po dołączeniu adnotacji @MapKeyTemporal nazwa kolumny ma domyślnie ATTRIBUTE + "_KEY".

Gdy adnotacja @MapKeyColumn i @MapKeyTemporal, nazwa kolumny jest domyślnie ATTRIBUTE + "_KEY", ale do jakiego typu klucz jest domyślny? A może masz błąd?

Szukałem podobnej sytuacji i znalazłem @MapKeyEnumerated. Jest to to samo, ponieważ jest związane z kolumną @MapKeyColumn i jest to wartość, którą można odwzorować na wiele typów danych (java.sql.Date/java.sql.Time/java.sql.Timestamp dla @MapKeyTemporal i EnumeratedType.ORDINAL/EnumeratedType.STRING dla @MapKeyEnumerated). Znalazłem jedną różnicę: @MapKeyEnumerated ma wartość domyślną. Ta wartość domyślna to EnumeratedType.ORDINAL.

Moje pytanie: Podczas korzystania z mapy, która ma klucz mapy, którego podstawowym typem jest typ czasowy, jaki jest domyślny TemporalType (zgodnie z JPA 2.0), do którego klucz mapy jest konwertowany w celu zachowania trwałości?

+0

Zastanawiasz się nad przyznaniem nagrody, ale nie jestem pewien, czy uda mi się uzyskać odpowiedź. Czy ktoś mógłby mi powiedzieć, jak poprawić moje pytanie, więc będę w stanie uzyskać odpowiedź (być może z nagrodą w wysokości 50)? – Pimgd

Odpowiedz

3

Odpowiedź wydaje się, że nie ma domyślnego typu, gdy java.util.Date lub java.util.Calendar jest używany jako klucz mapy. Sama specyfikacja (uważam, że javadocs dostarczono ze specyfikacją jako częścią specyfikacji) jest bardzo ścisła o używaniu MapKeyTemporal. Dokumentacja Javadoc dla MapKeyTemporal:

Ta adnotacja musi być określona dla trwałych kluczy map typu i kalendarza.

Myślę, że z taką surowością zapomniałem, że prezentujesz, mając informacje o typie z atrybutu, do którego odwołuje się MapKey. Nie ma większego sensu określanie typu w przypadku MapKey, ponieważ typ jest już określony w encji, która jest wartością mapy. Nie jest również pożądane umożliwienie posiadania innego typu czasowego dla klucza mapy dla odpowiedniego pola w jednostce.

Jeśli MapKeyTemporal nie jest określony, a jeśli nie ma innego sposobu, aby dowiedzieć się typ klucza (implementacja referencyjna, choć nie zawsze jest po specyfikacji) EclipseLink produkuje następujący wyjątek:

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The attribute [map] from the entity class [class X] 
does not specify a temporal type. A temporal type must be specified for persistent 
fields or properties of type java.util.Date and java.util.Calendar. 
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) 
+0

Czy to oznacza, że ​​@MapKeyTemporal jest ZAWSZE wymagany, czy tylko wtedy, gdy nie można uzyskać innych adnotacji? – Pimgd

+0

Trudno dojść do wniosku, ponieważ dokumentacja jest bardziej rygorystyczna niż jest to konieczne. Realizacja odniesienia przyjmuje "tylko wtedy, gdy nie można uzyskać" - podejście. Dla mnie ma to więcej sensu niż "zawsze", ponieważ wtedy nie ma problemu z konfliktem między wartością MapKeyTemporal i TemporalType podaną dla atrybutu w jednostce docelowej. –

0

Zasadniczo, nie pytasz, czy istnieje domyślny typ dla MapKeyTemporal, ale jeśli implementacje JPA 2.0 lub specyfikacji używają wartości domyślnej dla Typów Temporalu.

Co oznacza, że ​​istnieje ważniejszy typ w bazie danych między datą a datownikiem, prawdopodobnie tak nie jest.

Również jeśli masz kalendarz, implementacja prawdopodobnie wywołuje metodę getTime(), a następnie tworzy nowy typ Sql, jak decyduje o implementacji?

Przypomnienie: Pierwszy powód istnienia temporalnego jest po prostu tym, że klucz z klasą java.util.Date może być jednym z trzech typów czasu w Javie (Time, Timestamp i sql.Date), podczas gdy nie ma znaczenia w Javie, robi to w bazie danych, w której są to różne typy.

Jeśli nie określiłem typu czasowego, nic nie powstrzyma mnie przed różnymi typami sql dla tej samej jednostki, łamanie w czasie wykonywania.

+0

Twoja odpowiedź zostanie przetłumaczona jako "domyślna jest zależna od dostawcy/dostawcy". Nie szukam sposobu na wykonanie określonej implementacji; Szukam standardu JPA, a jeśli jest niedostępny, najczęściej wdrażanego domyślnie. – Pimgd

+0

Nie, nie sądzę, że mnie rozumiesz. Uzasadniłem, że w żadnej implementacji nie ma domyślnego typu czasu. – Gepsens

Powiązane problemy