Java >> Java tutorial >  >> Tag >> transient

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 med Transient 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 eller Transient .
  • 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.


Java tag