2009-08-15 2 views

ответ

310

@Transient соответствует вашим потребностям.

+10

Но тогда Джексон не будет сериализовать поле при конвертации в JSON ... как решить? – MobileMon

+0

, который зависит от вашего приложения.если вы комментируете свой класс сущностей - это применимо повсюду; но если вы анонтируете dao, который использует сущность - это еще одна история. вкратце: используйте DAO, когда у вас несколько хранилищ – Sarief

+0

@MobileMon проверить мой ответ ниже о jackson – user3871754

18

Чтобы игнорировать поле, отметьте его @Transient, чтобы он не отображался в спящем режиме.
Источник: Hibernate Annotations.

14

Этот ответ приходит немного позже, но он завершает ответ.

Для того, чтобы избежать поле от объекта, чтобы быть сохранены в БД, можно использовать один из двух механизмов:

@Transient - аннотации JPA маркировки поля не persistable

transient ключевое слово в java. Остерегайтесь - используя это ключевое слово, предотвратит использование поля с любым механизмом сериализации из java. Итак, если поле должно быть сериализовано, вам лучше использовать только аннотацию @Transient.

+0

как насчет того, что я просто хочу игнорировать упорство на методе get ?. Например: myjparepository.save() wil сохранит модель как обычно, а myjparepository.find (id) будет игнорировать поле, которое я хочу? – xtiger

+0

нет идеи если возможно. Извините –

2

Для завершения вышеуказанных ответов, я имел дело с помощью файла сопоставления XML, где ни @Transient, ни transient работал ... я должен был поставить переходную информацию в файле XML:

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

К игнорировать поле, аннотировать его @Transient, чтобы он не отображался в спящем режиме.

, но затем jackson не будет сериализовать поле при конвертации в JSON.

Если вам нужно смешивать JPA с JSON (опустить на JPA, но по-прежнему включают в Джексон) использовать @JsonInclude:

@JsonInclude() 
@Transient 
private String token; 

Вы также можете использовать JsonInclude.Include.NON_NULL и скрыть поля в формате JSON при десериализации при token == null:

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

Я запускаю JAX-RS 2.0.1/Jersey 2.25.1/Jackson 2.8.7 и с этим стекем '@ JsonInclude' не требуется: поля' @ Transient' по-прежнему включены в JSON. (Вы все еще получили мой голос: сама техника может быть очень полезной в других обстоятельствах). – DKroot

1

Ни один из вышеперечисленных ответов не работал для меня, используя Hibernate 5.2.10, Jersey 2.25.1 и Jackson 2.8.9. Я наконец нашел ответ (вроде, они ссылаются на hibernate4module, но он работает и на 5) here. Ни одна из аннотаций Json не работала с @Transient. По-видимому, Jackson2 «умный», чтобы любезно игнорировать вещи, отмеченные @Transient, если вы явно не рассказываете об этом. Ключ в том, чтобы добавить модуль hibernate5 (который я использовал, чтобы иметь дело с другими аннотациями Hibernate) и отключить функцию USE_TRANSIENT_ANNOTATION в моем Джерси Применение:

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

Вот зависимость для Hibernate5Module:

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

После попытки любой другой метод упомянул выше и другие '@ JsonProperty' ' @ JsonInclude' '@JsonSerialize + @ JsonDeserialize'' mapper.configure (MapperFeature.PROPAGATE_TRANSIENT_MARKER, ложь)); ' это решение, наконец, работал. Благодаря! – Aceonline

Смежные вопросы