it-swarm.com.de

JPA schnellste Weg, um ein Feld während der Persistenz zu ignorieren?

Ich bin im Wesentlichen auf der Suche nach einer Annotation vom Typ "@Ignore", mit der ich verhindern kann, dass ein bestimmtes Feld beibehalten wird. Wie kann das erreicht werden?

240
m2o

@Transient entspricht Ihren Bedürfnissen.

392
cletus

Wenn Sie ein Feld ignorieren möchten, kommentieren Sie es mit @Transient wird also nicht im Ruhezustand abgebildet.

aber dann serialisiert Jackson das Feld nicht , wenn es in JSON konvertiert wird.

Wenn Sie JPA mit JSON mischen müssen (von JPA weggelassen, aber immer noch in Jackson enthalten), verwenden Sie @JsonInclude :

@JsonInclude()
@Transient
private String token;

TIPP:

Sie können auch JsonInclude.Include.NON_NULL verwenden und Felder in JSON während der Deserialisierung ausblenden, wenn token == null:

@JsonInclude(JsonInclude.Include.NON_NULL)
@Transient
private String token;
93

Wenn Sie ein Feld ignorieren möchten, kommentieren Sie es mit @Transient Es wird also nicht im Ruhezustand abgebildet.
Quelle: Anmerkungen zum Ruhezustand .

22
Jonathan

Diese Antwort kommt etwas spät, aber sie vervollständigt die Antwort.

Um zu vermeiden, dass ein Feld aus einer Entität in der Datenbank verbleibt, kann einer der beiden folgenden Mechanismen verwendet werden:

@ Transient - Die JPA-Anmerkung, die ein Feld als nicht dauerhaft kennzeichnet

transient 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 serialisiert werden muss, sollten Sie nur die Anmerkung @ Transient verwenden.

16
Olimpiu POP

Um die obigen Antworten zu vervollständigen, hatte ich den Fall mit einer XML-Zuordnungsdatei, in der weder das @Transient noch transient hat funktioniert ... Ich musste die vorübergehenden Informationen in die XML-Datei schreiben:

<attributes>
(...)
    <transient name="field" />
</attributes>
2
Vinze

Keine der obigen Antworten funktionierte für mich mit Hibernate 5.2.10, Jersey 2.25.1 und Jackson 2.8.9. Ich fand schließlich die Antwort (Art, sie verweisen auf hibernate4module, aber es funktioniert auch für 5) hier . Keine der Json-Annotationen hat mit @Transient Funktioniert. Anscheinend ist Jackson2 "klug" genug, um mit @Transient Gekennzeichnete Inhalte zu ignorieren, es sei denn, Sie weisen ausdrücklich an, dies nicht zu tun. Der Schlüssel war das Hinzufügen des Moduls hibernate5 (mit dem ich mich um andere Hibernate-Anmerkungen gekümmert habe) und das Deaktivieren der Funktion USE_TRANSIENT_ANNOTATION In meiner Jersey-Anwendung:

ObjectMapper jacksonObjectMapper = new ObjectMapper();
Hibernate5Module jacksonHibernateModule = new Hibernate5Module();
jacksonHibernateModule.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION);
jacksonObjectMapper.registerModule(jacksonHibernateModule);  

Hier ist die Abhängigkeit für das Hibernate5Module:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-hibernate5</artifactId>
    <version>2.8.9</version>
</dependency>
1
Hodglem