Ich suche im Wesentlichen nach einer Annotation vom Typ "@Ignore", mit der ich verhindern kann, dass ein bestimmtes Feld beibehalten wird. Wie kann dies erreicht werden?
281
@Transient
entspricht Ihren Bedürfnissen.
Um ein Feld zu ignorieren, kommentieren Sie es mit,
@Transient
damit es nicht im Ruhezustand zugeordnet wird.Aber dann serialisiert Jackson das Feld bei der Konvertierung in JSON nicht.
Wenn Sie JPA mit JSON mischen müssen (von JPA weglassen, aber immer noch in Jackson enthalten), verwenden Sie
@JsonInclude
:TRINKGELD:
Sie können auch JsonInclude.Include.NON_NULL verwenden und Felder in JSON während der Deserialisierung ausblenden, wenn
token == null
:quelle
@JsonInclude
ist dies nicht erforderlich:@Transient
Felder sind weiterhin in JSON enthalten. (Sie haben immer noch meine Stimme erhalten: Die Technik selbst könnte unter anderen Umständen sehr nützlich sein).Um ein Feld zu ignorieren, kommentieren Sie es mit,
@Transient
damit es nicht im Ruhezustand zugeordnet wird.Quelle: Anmerkungen zum Ruhezustand .
quelle
Diese Antwort kommt etwas spät, vervollständigt aber die Antwort.
Um zu vermeiden, dass ein Feld einer Entität in der Datenbank beibehalten wird, kann einer der beiden Mechanismen verwendet werden:
@Transient - Die JPA-Annotation, die ein Feld als nicht dauerhaft markiert
vorübergehendes Schlüsselwort in Java. Achtung: Wenn Sie dieses Schlüsselwort verwenden, wird verhindert, dass das Feld mit einem Serialisierungsmechanismus von Java verwendet wird. Wenn das Feld also serialisiert werden muss, verwenden Sie besser nur dieAnnotation @Transient .
quelle
Abhängig vom Entitätsattributtyp gibt es mehrere Lösungen.
Grundlegende Attribute
Angenommen, Sie haben die folgende
account
Tabelle:Die
account
Tabelle wird derAccount
Entität wie folgt zugeordnet :Die Grundeinheit Attribute werden in Tabellenspalten zugeordnet, so Eigenschaften wie
id
,iban
,cents
sind grundlegende Attribute.Aber die
dollars
,interestCents
undinterestDollars
Eigenschaften berechnet werden , so dass Sie sie mit Anmerkungen versehen mit@Transient
auszuschließen sie von SELECT, INSERT, UPDATE und DELETE SQL - Anweisungen.Verbände
Angenommen, Sie haben Folgendes
post
undpost_comment
Tabellen:Sie möchten die
lastestComment
Zuordnung in derPost
Entität der zuletztPostComment
hinzugefügten Entität zuordnen.Dazu können Sie die
@JoinFormula
Anmerkung verwenden:Beim Abrufen der
Post
Entität können Sie sehen, dass die EntitätlatestComment
abgerufen wird. Wenn Sie sie jedoch ändern möchten, wird die Änderung ignoriert.@MapsId
Eine andere Möglichkeit, Assoziationen zu ignorieren, die bereits von der Entitätskennung zugeordnet wurden, ist die Verwendung
@MapsId
.Betrachten Sie beispielsweise die folgende Eins-zu-Eins-Tabellenbeziehung:
Die
PostDetails
Entität wird wie folgt zugeordnet:Beachten Sie, dass sowohl das
id
Attribut als auch diepost
Zuordnung dieselbe Datenbankspalte zuordnen, die diepost_details
Primärschlüsselspalte ist.Um das
id
Attribut auszuschließen ,@MapsId
teilt die Annotation Hibernate mit, dass sich diepost
Zuordnung um den Spaltenwert der Tabelle Primärschlüssel kümmert.Verwenden von
insertable = false, updatable = false
Eine andere Option ist die Verwendung
insertable = false, updatable = false
für die Zuordnung, die vom Ruhezustand ignoriert werden soll.Zum Beispiel können wir die vorherige Eins-zu-Eins-Zuordnung wie folgt abbilden:
Die Attribute
insertable
undupdatable
der@JoinColumn
Annotation weisen Hibernate an, diepost
Zuordnung zu ignorieren , da sich die Entitätskennung um diepost_id
Spalte Primärschlüssel kümmert .quelle
post
undpost_details
Tabellen als Beispiel korrekt ?Um die obigen Antworten zu vervollständigen, hatte ich den Fall, dass eine XML-Zuordnungsdatei verwendet wurde, in der weder die
@Transient
nochtransient
funktionierte ... Ich musste die vorübergehenden Informationen in die XML-Datei einfügen:quelle
Keine der oben genannten Antworten hat bei mir mit Hibernate 5.2.10, Jersey 2.25.1 und Jackson 2.8.9 funktioniert. Ich fand schließlich die Antwort ( eine Art Bezug sie hibernate4module aber es funktioniert für 5 auch) hier . Keine der Json-Anmerkungen funktionierte überhaupt mit
@Transient
. Anscheinend ist Jackson2 "klug" genug, um Dinge zu ignorieren, die mit gekennzeichnet sind, es@Transient
sei denn, Sie sagen ausdrücklich, dass dies nicht der Fall ist . Der Schlüssel bestand darin, das Hibernate5-Modul hinzuzufügen (mit dem ich andere Hibernate-Anmerkungen bearbeitet habe) und dieUSE_TRANSIENT_ANNOTATION
Funktion in meiner Jersey-Anwendung zu deaktivieren :Hier ist die Abhängigkeit für das Hibernate5Module:
quelle
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
funktionierte diese Lösung schließlich. Vielen Dank!Manchmal möchten Sie:
Verwenden
@Column(name = "columnName", insertable = false, updatable = false)
Ein gutes Szenario ist, wenn eine bestimmte Spalte automatisch unter Verwendung anderer Spaltenwerte berechnet wird
quelle