Estou basicamente procurando por uma anotação do tipo "@Ignore" com a qual eu possa impedir que um determinado campo seja persistido. Como isso pode ser alcançado?
281
@Transient
está em conformidade com suas necessidades.
Para ignorar um campo, anote-o com,
@Transient
para que não seja mapeado pela hibernação.mas jackson não serializará o campo ao converter para JSON.
Se você precisar misturar JPA com JSON (omitir JPA, mas ainda incluir em Jackson), use
@JsonInclude
:DICA:
Você também pode usar JsonInclude.Include.NON_NULL e ocultar campos no JSON durante a desserialização quando
token == null
:fonte
@JsonInclude
não é necessário: os@Transient
campos ainda estão incluídos no JSON. (Você ainda recebeu meu voto: a técnica em si pode ser muito útil em outras circunstâncias).Para ignorar um campo, anote-o com,
@Transient
para que não seja mapeado pela hibernação.Fonte: anotações de hibernação .
fonte
Essa resposta chega um pouco tarde, mas completa a resposta.
Para evitar que um campo de uma entidade seja persistido no DB, pode-se usar um dos dois mecanismos:
@Transient - a anotação JPA que marca um campo como não persistente
palavra-chave transitória em java. Cuidado - usar esta palavra-chave impedirá que o campo seja usado com qualquer mecanismo de serialização do java. Portanto, se o campo precisar ser serializado, é melhor usar apenas aanotação @Transient .
fonte
Existem várias soluções, dependendo do tipo de atributo da entidade.
Atributos básicos
Considere que você tem a seguinte
account
tabela:A
account
tabela é mapeada para aAccount
entidade assim:As propriedades básicas da entidade são mapeados para as colunas da tabela, assim como propriedades
id
,iban
,cents
são atributos básicos.Mas a
dollars
,interestCents
einterestDollars
são propriedades calculado, para que anotá-los com@Transient
a excluí-los de SELECT, INSERT, UPDATE e instruções SQL DELETE.Associações
Supondo que você tenha o seguinte
post
epost_comment
tabelas:Você deseja mapear a
lastestComment
associação naPost
entidade para aPostComment
entidade mais recente que foi adicionada.Para fazer isso, você pode usar a
@JoinFormula
anotação:Ao buscar a
Post
entidade, você pode ver que elalatestComment
foi buscada, mas se você quiser modificá-la, a alteração será ignorada.@MapsId
Outra maneira de ignorar associações que já estão mapeadas pelo identificador de entidade é usar
@MapsId
.Por exemplo, considere o seguinte relacionamento de tabela um para um:
A
PostDetails
entidade é mapeada assim:Observe que o
id
atributo e apost
associação mapeiam a mesma coluna do banco de dados, que é apost_details
coluna Chave Primária.Para excluir o
id
atributo, a@MapsId
anotação informará ao Hibernate que apost
associação cuida do valor da coluna Chave Primária da tabela.Usando
insertable = false, updatable = false
Outra opção é usar
insertable = false, updatable = false
para a associação que você deseja que o Hibernate ignore.Por exemplo, podemos mapear a associação individual anterior como esta:
Os atributos
insertable
eupdatable
da@JoinColumn
anotação instruirão o Hibernate a ignorar apost
associação, pois o identificador da entidade cuida dapost_id
coluna Chave Primária.fonte
post
epost_details
tabelas como exemplo?Para concluir as respostas acima, tive o caso usando um arquivo de mapeamento XML em que nem o
@Transient
nemtransient
funcionava ... tive que colocar as informações transitórias no arquivo xml:fonte
Nenhuma das respostas acima funcionou para mim usando o Hibernate 5.2.10, Jersey 2.25.1 e Jackson 2.8.9. Finalmente encontrei a resposta (mais ou menos, eles fazem referência ao hibernate4module, mas funciona para 5 também) aqui . Nenhuma das anotações de Json funcionou
@Transient
. Aparentemente, o Jackson2 é 'inteligente' o suficiente para ignorar gentilmente as coisas marcadas com, a@Transient
menos que você diga explicitamente que não. A chave era adicionar o módulo hibernate5 (que eu estava usando para lidar com outras anotações do Hibernate) e desativar oUSE_TRANSIENT_ANNOTATION
recurso no meu aplicativo Jersey:Aqui está a dependência do Hibernate5Module:
fonte
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
essa solução finalmente funcionou. Obrigado!Às vezes você deseja:
Usar
@Column(name = "columnName", insertable = false, updatable = false)
Um bom cenário é quando uma determinada coluna é calculada automaticamente usando outros valores de coluna
fonte