Но тогда Джексон не будет сериализовать поле при конвертации в JSON ... как решить?
MobileMon
это зависит от вашего приложения. если вы аннотируете свой класс сущностей - он применяется везде; но если вы аннотируете Дао, который использует сущность - это другая история. короче говоря: используйте DAO, когда у вас есть несколько хранилищ
Андрей Плотников
Не работает с полями списка. Для полей типа Коллекция Hibernate фактически создает новую промежуточную таблицу. Любой обходной путь для этого?
Я использую JAX-RS 2.0.1 / Джерси 2.25.1 / Джексон 2.8.7, и с этим стеком @JsonIncludeнет необходимости: @Transientполя все еще включены в JSON. (Вы все еще получили мой голос: сама техника может быть очень полезна в других обстоятельствах).
DKroot
2
Я сделал это на Spring Boot
Камиль Неканович
Привет, я пытаюсь использовать это, но это не сериализовано с полем @Transient
Мохаммед
@ Мохаммед добавить аннотацию @JsonInclude ()
Камил Неканович
Пробовал это в Spring Boot 2.1.7, но не сработало. Но все же вы получаете мой голос, потому что он может работать в других сценариях.
Адитья Экбот
25
Чтобы игнорировать поле, пометьте его, @Transientчтобы оно не отображалось в спящем режиме.
Источник: Hibernate Аннотации .
Этот ответ приходит немного поздно, но он завершает ответ.
Во избежание сохранения поля из сущности в БД можно использовать один из двух механизмов:
@Transient - аннотация JPA, помечающая поле как нестабильное
временное ключевое слово в Java. Осторожно - использование этого ключевого слова предотвратит использование поля с любым механизмом сериализации из Java. Итак, если поле должно быть сериализовано, вам лучше использоватьаннотацию @Transient .
Как насчет того, чтобы просто игнорировать постоянство метода get? Например: myjparepository.save () сохранит модель как обычно, а myjparepository.find (id) проигнорирует поле, которое мне нужно?
xtiger
@xtiger вы можете создать собственный запрос для архивации этой функциональности. Вот пример ссылки
Мохале
7
Существует несколько решений в зависимости от типа атрибута объекта.
Основные атрибуты
Предположим, у вас есть следующая accountтаблица:
accountТаблица отображается в Accountсущности , как это:
Основные атрибуты сущностей отображаются в столбцах таблицы, поэтому свойства , такие как id, iban, centsявляются основными атрибутами.
Но dollars, interestCentsи interestDollarsвычисляются свойства, так что вы аннотировать их , @Transientчтобы исключить их из SELECT, INSERT, UPDATE и DELETE заявления SQL.
Итак, для базовых атрибутов вам нужно использовать @Transient, чтобы исключить сохранение данного свойства.
Для получения дополнительной информации о вычисляемых атрибутах сущности, ознакомьтесь с этой статьей .
ассоциации
Предполагая, что у вас есть следующее postи post_commentтаблицы:
Вы хотите сопоставить lastestCommentассоциацию в Postсущности с последней PostCommentдобавленной сущностью.
Для этого вы можете использовать @JoinFormulaаннотацию:
@Entity(name ="Post")@Table(name ="post")publicclassPost{@IdprivateLong id;privateString title;@ManyToOne(fetch =FetchType.LAZY)@JoinFormula("("+"SELECT pc.id "+"FROM post_comment pc "+"WHERE pc.post_id = id "+"ORDER BY pc.created_on DESC "+"LIMIT 1"+")")privatePostComment latestComment;//Getters and setters omitted for brevity}
При извлечении Postсущности вы можете видеть, что latestCommentона извлекается, но если вы хотите изменить ее, изменение будет проигнорировано.
Таким образом, для ассоциаций вы можете использовать, @JoinFormulaчтобы игнорировать операции записи, но при этом разрешать чтение ассоциации.
Для более подробной информации о вычисляемых ассоциациях, посмотрите эту статью .
@MapsId
Другой способ игнорировать ассоциации, которые уже сопоставлены идентификатором объекта, - использовать @MapsId.
Например, рассмотрим следующую взаимосвязь таблицы «один к одному»:
PostDetailsОбъект отображается следующим образом:
@Entity(name ="PostDetails")@Table(name ="post_details")publicclassPostDetails{@IdprivateLong id;@Column(name ="created_on")privateDate createdOn;@Column(name ="created_by")privateString createdBy;@OneToOne(fetch =FetchType.LAZY)@MapsIdprivatePost post;publicPostDetails(){}publicPostDetails(String createdBy){
createdOn =newDate();this.createdBy = createdBy;}//Getters and setters omitted for brevity}
Обратите внимание, что и idатрибут, и postсопоставление отображают один и тот же столбец базы данных, который является post_detailsстолбцом первичного ключа.
Чтобы исключить idатрибут, @MapsIdаннотация сообщит Hibernate, что postассоциация заботится о значении столбца первичного ключа таблицы.
Таким образом, когда идентификатор объекта и ассоциация совместно используют один и тот же столбец, вы можете использовать, @MapsIdчтобы игнорировать атрибут идентификатора объекта и использовать вместо него ассоциацию.
Для более подробной информации @MapsId, ознакомьтесь с этой статьей .
С помощью insertable = false, updatable = false
Другой вариант - использовать insertable = false, updatable = falseдля ассоциации, которую вы хотите игнорировать в Hibernate.
Например, мы можем сопоставить предыдущую однозначную ассоциацию следующим образом:
В insertableи updatableатрибутах @JoinColumnаннотации будут инструктировать Hibernate игнорировать postассоциацию с момента субъекта идентификатора заботится о post_idстолбце первичного ключа.
Обратите внимание, что атрибут id и пост-ассоциация сопоставляют один и тот же столбец базы данных, который является столбцом первичного ключа post_comment. Это правильно в контексте postи post_detailsтаблиц в качестве примера?
Дэвид
1
Спасибо, что заметили это. Я починил это.
Влад Михальча
3
Чтобы завершить приведенные выше ответы, у меня был случай, использующий файл сопоставления XML, где ни сработало, @Transientни transientсработало ... Мне пришлось поместить временную информацию в файл XML:
Ни один из приведенных выше ответов не работал для меня, используя Hibernate 5.2.10, Jersey 2.25.1 и Jackson 2.8.9. Я наконец нашел ответ (вроде как они ссылаются на hibernate4module, но он работает и для 5) здесь . Ни одна из аннотаций Json не работала вообще @Transient. Очевидно, Jackson2 достаточно «умен», чтобы любезно игнорировать вещи, помеченные значком, @Transientесли вы явно не скажете этого не делать. Ключом было добавить модуль hibernate5 (который я использовал для работы с другими аннотациями Hibernate) и отключить эту USE_TRANSIENT_ANNOTATIONфункцию в моем приложении на Джерси:
После попытки каждого другого метода, упомянутого выше и других, @JsonProperty@JsonInclude@JsonSerialize + @JsonDeserializemapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));это решение, наконец, сработало. Спасибо!
Aceonline
1
Иногда вы хотите:
Сериализация колонки
Проигнорируйте колонку как сохраняющуюся:
использование @Column(name = "columnName", insertable = false, updatable = false)
Хороший сценарий - это когда определенный столбец автоматически вычисляется с использованием других значений столбца.
Чтобы игнорировать поле, пометьте его,
@Transient
чтобы оно не отображалось в спящем режиме.но тогда Джексон не будет сериализовать поле при преобразовании в JSON.
Если вам нужно смешать JPA с JSON (опускается JPA, но все еще включается в Джексона), используйте
@JsonInclude
:НАКОНЕЧНИК:
Вы также можете использовать JsonInclude.Include.NON_NULL и скрывать поля в JSON во время десериализации, когда
token == null
:источник
@JsonInclude
нет необходимости:@Transient
поля все еще включены в JSON. (Вы все еще получили мой голос: сама техника может быть очень полезна в других обстоятельствах).Чтобы игнорировать поле, пометьте его,
@Transient
чтобы оно не отображалось в спящем режиме.Источник: Hibernate Аннотации .
источник
Этот ответ приходит немного поздно, но он завершает ответ.
Во избежание сохранения поля из сущности в БД можно использовать один из двух механизмов:
@Transient - аннотация JPA, помечающая поле как нестабильное
временное ключевое слово в Java. Осторожно - использование этого ключевого слова предотвратит использование поля с любым механизмом сериализации из Java. Итак, если поле должно быть сериализовано, вам лучше использоватьаннотацию @Transient .
источник
Существует несколько решений в зависимости от типа атрибута объекта.
Основные атрибуты
Предположим, у вас есть следующая
account
таблица:account
Таблица отображается вAccount
сущности , как это:Основные атрибуты сущностей отображаются в столбцах таблицы, поэтому свойства , такие как
id
,iban
,cents
являются основными атрибутами.Но
dollars
,interestCents
иinterestDollars
вычисляются свойства, так что вы аннотировать их ,@Transient
чтобы исключить их из SELECT, INSERT, UPDATE и DELETE заявления SQL.ассоциации
Предполагая, что у вас есть следующее
post
иpost_comment
таблицы:Вы хотите сопоставить
lastestComment
ассоциацию вPost
сущности с последнейPostComment
добавленной сущностью.Для этого вы можете использовать
@JoinFormula
аннотацию:При извлечении
Post
сущности вы можете видеть, чтоlatestComment
она извлекается, но если вы хотите изменить ее, изменение будет проигнорировано.@MapsId
Другой способ игнорировать ассоциации, которые уже сопоставлены идентификатором объекта, - использовать
@MapsId
.Например, рассмотрим следующую взаимосвязь таблицы «один к одному»:
PostDetails
Объект отображается следующим образом:Обратите внимание, что и
id
атрибут, иpost
сопоставление отображают один и тот же столбец базы данных, который являетсяpost_details
столбцом первичного ключа.Чтобы исключить
id
атрибут,@MapsId
аннотация сообщит Hibernate, чтоpost
ассоциация заботится о значении столбца первичного ключа таблицы.С помощью
insertable = false, updatable = false
Другой вариант - использовать
insertable = false, updatable = false
для ассоциации, которую вы хотите игнорировать в Hibernate.Например, мы можем сопоставить предыдущую однозначную ассоциацию следующим образом:
В
insertable
иupdatable
атрибутах@JoinColumn
аннотации будут инструктировать Hibernate игнорироватьpost
ассоциацию с момента субъекта идентификатора заботится оpost_id
столбце первичного ключа.источник
post
иpost_details
таблиц в качестве примера?Чтобы завершить приведенные выше ответы, у меня был случай, использующий файл сопоставления XML, где ни сработало,
@Transient
ниtransient
сработало ... Мне пришлось поместить временную информацию в файл XML:источник
Ни один из приведенных выше ответов не работал для меня, используя Hibernate 5.2.10, Jersey 2.25.1 и Jackson 2.8.9. Я наконец нашел ответ (вроде как они ссылаются на hibernate4module, но он работает и для 5) здесь . Ни одна из аннотаций Json не работала вообще
@Transient
. Очевидно, Jackson2 достаточно «умен», чтобы любезно игнорировать вещи, помеченные значком,@Transient
если вы явно не скажете этого не делать. Ключом было добавить модуль hibernate5 (который я использовал для работы с другими аннотациями Hibernate) и отключить этуUSE_TRANSIENT_ANNOTATION
функцию в моем приложении на Джерси:Вот зависимость для Hibernate5Module:
источник
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
это решение, наконец, сработало. Спасибо!Иногда вы хотите:
использование
@Column(name = "columnName", insertable = false, updatable = false)
Хороший сценарий - это когда определенный столбец автоматически вычисляется с использованием других значений столбца.
источник