351 Stimmen

Wie lässt sich ein JPA-Feld während der Persistenz am einfachsten ignorieren?

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

9voto

Obothlale Punkte 171

Manchmal möchte man das:

  1. Serialisieren einer Spalte
  2. Ignoriere Spalte von der Persistierung:

Utilice @Column(name = "columnName", insertable = false, updatable = false)

Ein gutes Szenario ist, wenn eine bestimmte Spalte automatisch durch Verwendung anderer Spaltenwerte berechnet wird

7voto

Andrey Punkte 1374

Verwenden Sie @Transient, damit JPA das Feld ignoriert.

aber! Jackson serialisiert dieses Feld nicht mit. Zur Lösung fügen Sie einfach @JsonProperty

ein Beispiel

@Transient
@JsonProperty
private boolean locked;

4voto

Vinze Punkte 2529

Um die obigen Antworten zu vervollständigen, hatte ich den Fall, dass ich eine XML-Zuordnungsdatei verwendete, in der weder die @Transient noch transient funktionierte... Ich musste die vorübergehenden Informationen in die Xml-Datei eingeben:

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

4voto

Hodglem Punkte 574

Keine der oben genannten Antworten funktionierte bei mir mit Hibernate 5.2.10, Jersey 2.25.1 und Jackson 2.8.9. Ich habe schließlich die Antwort gefunden (sozusagen, sie verweisen auf hibernate4module, aber es funktioniert auch für 5) aquí . Keine der Json-Anmerkungen funktionierte überhaupt mit @Transient . Offensichtlich ist Jackson2 "schlau" genug, um Dinge zu ignorieren, die mit @Transient es sei denn, Sie sagen ausdrücklich, dass sie es nicht tun sollen. Der Schlüssel dazu war das Hinzufügen des hibernate5-Moduls (das ich für andere Hibernate-Annotationen verwendete) und das Deaktivieren der USE_TRANSIENT_ANNOTATION Funktion 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 Hibernate5Modul:

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

1voto

ala_pobs Punkte 11

Offenbar wird @Transient bei Verwendung des Hibernate5Moduls nicht serialisiert, wenn ObjectMapper verwendet wird. Durch das Entfernen wird es funktionieren.

import javax.persistence.Transient;

import org.junit.Test;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TransientFieldTest {

    @Test
    public void Print_Json() throws JsonProcessingException {

        ObjectMapper objectEntityMapper = new ObjectMapper();
        //objectEntityMapper.registerModule(new Hibernate5Module());
        objectEntityMapper.setSerializationInclusion(Include.NON_NULL);

        log.info("object: {}", objectEntityMapper.writeValueAsString( //
                SampleTransient.builder()
                               .id("id")
                               .transientField("transientField")
                               .build()));

    }

    @Getter
    @Setter
    @Builder
    private static class SampleTransient {

        private String id;

        @Transient
        private String transientField;

        private String nullField;

    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X