2012-01-23 1 views
7

Sto lavorando alla creazione di un kit di conformità annotazione JPA 2.0 per il mio stage. Al momento, mi chiedo quando è richiesta un'annotazione @MapKeyTemporal e quando è facoltativa ...Qual è il TemporalType predefinito per una chiave di mappa temporale senza un'annotazione @MapKeyColumn o @MapKeyTemporal?

So che quando si definisce la colonna della chiave mappa utilizzando @MapKeyColumn, il tipo di chiave deve essere mappata a può essere derivato guardando il tipo della colonna (e altrimenti il ​​tipo nella columndefinition). Pertanto, in questo caso, non è necessaria alcuna annotazione @MapKeyTemporal.

Quando si allega l'annotazione @MapKeyTemporal, il nome della colonna viene impostato su ATTRIBUTE + "_KEY".

Quando non si annota @MapKeyColumn e @MapKeyTemporal, il nome della colonna viene impostato su ATTRIBUTE + "_KEY", ma a quale tipo viene impostato il valore predefinito della chiave? O dovresti ricevere un errore?

Ho cercato una situazione simile e ho trovato @MapKeyEnumerated. È lo stesso perché è correlato a @MapKeyColumn ed è un valore che può essere associato a più tipi di dati (java.sql.Date/java.sql.Time/java.sql.Timestamp per @MapKeyTemporal e EnumeratedType.ORDINAL/EnumeratedType.STRING per @MapKeyEnumerated). Ho trovato una differenza: @MapKeyEnumerated ha un valore predefinito. Questo valore predefinito è EnumeratedType.ORDINAL.

La mia domanda: Quando si utilizza una mappa che ha una chiave mappa il cui tipo di base è un tipo temporale, qual è il TemporalType di default (secondo JPA 2.0) a cui la chiave della mappa viene convertito per la persistenza?

+0

Mi chiedo se mettere una taglia su questo, ma non sono sicuro che avrò una risposta. Qualcuno potrebbe dirmi come migliorare la mia domanda quindi potrò ottenere una risposta (possibilmente con una taglia di 50)? – Pimgd

risposta

3

La risposta sembra essere che non esiste un tipo predefinito quando java.util.Date o java.util.Calendar viene utilizzato come chiave della mappa. La specifica stessa (considero i javadoc forniti con le specifiche come parte delle specifiche) è molto rigida sull'uso di MapKeyTemporal. Javadoc per MapKeyTemporal afferma:

Questa annotazione deve essere specificato per le chiavi della mappa persistenti di tipo Data e calendario.

Penso che con un tale rigore si sia dimenticato il caso che si presenta, avendo le informazioni sul tipo dall'attributo riferito da MapKey. Non ha molto senso specificare il tipo nel caso di MapKey, perché il tipo è già specificato nell'entità che è il valore della mappa. Inoltre, non è desiderabile consentire la possibilità di avere un tipo temporale diverso per la chiave della mappa per il campo corrispondente nell'entità.

Se MapKeyTemporal non è specificato e se non c'è altro modo per capire tipo di chiave, (implementazione di riferimento, anche se non è sempre seguendo specifica) EclipseLink produce eccezione seguente:

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

Ciò significa che @MapKeyTemporal è SEMPRE richiesto, o solo se non è possibile derivare da altre annotazioni? – Pimgd

+0

È difficile concludere, perché la documentazione è più rigorosa del necessario. L'implementazione di riferimento richiede "solo quando non è possibile derivare" -approach. Per me ha più senso di "sempre", perché quindi non c'è alcun problema con il conflitto tra il valore di MapKeyTemporal e TemporalType specificato per l'attributo nell'entità di destinazione. –

0

Fondamentalmente, non stai chiedendo se esiste un tipo predefinito per MapKeyTemporal, ma se le implementazioni di JPA 2.0 o le specifiche utilizzano un valore predefinito per i tipi temporali.

Ciò significa che esiste un tipo più importante in un database tra Data e Timestamp, che probabilmente non è il caso.

Anche se si dispone di un calendario, l'implementazione probabilmente chiama getTime() e quindi costruisce un nuovo tipo Sql da lì, come decide l'implementazione?

Promemoria: La prima ragione dell'esistenza di temporali è semplicemente perché una chiave con la classe java.util.Date può essere uno dei tre tipi di tempo in Java (Time, Timestamp e sql.Date), mentre questo non importa in Java, lo fa in un database in cui questi sono tipi distinti.

Se non si specifica un tipo temporale, nulla mi impedisce di avere tipi sql diversi per la stessa entità, interrompendoli in fase di esecuzione.

+0

La tua risposta verrebbe tradotta come "predefinito è fornitore/specifico del fornitore". Non sto cercando un modo specifico di implementare le cose; Sto cercando lo standard JPA e, se non disponibile, il valore predefinito più comunemente implementato. – Pimgd

+0

No, non penso che tu mi abbia capito. Stavo giustificando che non esiste un tipo orario predefinito in nessuna implementazione. – Gepsens