Tager Hibernate/JPA transientmodifikatoren i betragtning (ikke annotationen)
Er transient
modifier min ven? Er @Transient
annotation og transient
modifikator relateret eller ikke en alle ?
De er ikke rigtigt relateret, men jeg er bange for, at de alligevel ikke bliver din ven, transient
egenskaber bevares ikke af Hibernate/JPA. JPA-specifikationen udtrykker det sådan:
2.1.1 Vedvarende felter og egenskaber
Den vedvarende tilstand af en enhed er tilgået af persistence providerruntime enten via JavaBeans styleproperty accessors eller via instansvariabler. En enkelt adgangstype (felt- eller egenskabsadgang) gælder for entitetshierarki. Når annoteringer bruges, angiver placeringen af kortlægningsannotationerne på enten de vedvarende felter eller de vedvarende egenskaber af enhedsklassen, at adgangstyperne er enten felt- eller egenskabsbaseret adgang.
- Hvis enheden har feltbaseret adgang, får persistensudbyderen runtime direkte adgang til instansvariabler. Alle ikke-
transient
instansvariabler, der ikke er kommenteret medTransient
annotering er vedvarende. Når feltbaseret adgang bruges, annoterer objekt-/relationel mapping-annoteringer for enhedsklassen instansvariablerne. - Hvis enheden har egenskabsbaseret adgang, får persistensudbyderen runtime adgang til persistent tilstand via egenskabsadgangsmetoderne. Alle egenskaber er ikke annoteret med
Transient
annotering er vedvarende. Ejendomsadgangsmetoderne skal være offentlige eller beskyttede. Når egenskabsbaseret adgang bruges, annoterer objekt/relationel kortlægningsannoteringer for enhedsklassen getter-egenskabsadgangene. - Kortlægningsannoteringer kan ikke anvendes på felter eller egenskaber, der er
transient
ellerTransient
. - Adfærden er uspecificeret, hvis tilknytningsannoteringer anvendes på både vedvarende felter og egenskaber, eller hvis XML-beskrivelsen specificerer brugen af forskellige adgangstyper inden for et klassehierarki.
...
Referencer
- JPA 1.0-specifikation
- Afsnit 2.1.1 Vedvarende felter
- Hibernate Core Reference Guide
- 2.2.2. Kortlægning af simple egenskaber
Relaterede spørgsmål
- Hvorfor har JPA en @Forbigående annotering?
Den del af JPA-specifikationen indsendt af Pascal Thivent ser ret forvirrende ud. Faktisk respekterer Hibernate transient
når markadgang bruges, men ignorerer ved ejendomsadgang. Måske er det en Hibernate-specifik adfærd.
For eksempel i dette tilfælde bar
er ikke serialiseret, men stadig bevaret til databasen:
@Entity
@Access(AccessType.FIELD) // Default access type - field
public class Foo {
@Id @GeneratedValue
private Long id;
transient private String bar;
...
@Access(AccessType.PROPERTY) // Override default access type for this property
public String getBar() { return bar; }
}
EDIT: Da det er uklart, hvordan denne adfærd er i overensstemmelse med JPA-specifikationen, er det måske bedre at bruge forskellige navne til transient
felt og den tilsvarende egenskab.