Pero entonces Jackson no serializará el campo cuando convierta a JSON ... ¿cómo resolverlo?
MobileMon
eso depende del diseño de su aplicación. si anota su clase de entidad, se aplica en todas partes; pero si anotateo que usa entidad - es otra historia. en resumen: use DAO cuando tenga múltiples almacenamientos
Andrii Plotnikov
No funciona en los campos de Lista. Para los campos de tipo Colección, hibernate en realidad crea una nueva tabla intermedia. ¿Alguna solución para eso?
Estoy ejecutando JAX-RS 2.0.1 / Jersey 2.25.1 / Jackson 2.8.7 y con esa pila @JsonIncludeno es necesario: los @Transientcampos todavía están incluidos en JSON. (Todavía tienes mi voto: la técnica en sí misma podría ser muy útil en otras circunstancias).
DKroot
2
Lo hice en Spring Boot
Kamil Nekanowicz
hola, estoy tratando de usar esto, pero no se está serializando con el campo @Transient
Mohammad
@Mohammad agrega anotación @JsonInclude ()
Kamil Nekanowicz
Intenté esto en Spring Boot 2.1.7 pero no funcionó. Pero aún así obtienes mi voto porque puede funcionar en otros escenarios.
Aditya Ekbote
25
Para ignorar un campo, anótelo con @Transientpara que hibernate no lo asigne.
Fuente: Anotaciones de Hibernate .
Esta respuesta llega un poco tarde, pero completa la respuesta.
Para evitar que un campo de una entidad persista en DB, se puede usar uno de los dos mecanismos:
@Transient : la anotación JPA que marca un campo como no persistente
palabra clave transitoria en java. Cuidado: el uso de esta palabra clave evitará que el campo se use con cualquier mecanismo de serialización de java. Entonces, si el campo debe ser serializado, será mejor que use solo laanotación @Transient .
¿Qué tal si solo quiero ignorar la persistencia en el método get ?. Por ejemplo: myjparepository.save () guardará el modelo como de costumbre, y myjparepository.find (id) ignorará el campo que quiero.
xtiger 01 de
@xtiger puede crear una consulta personalizada para archivar esa funcionalidad. Aquí hay un enlace de
Mohale
7
Existen múltiples soluciones según el tipo de atributo de la entidad.
Atributos básicos
Considere que tiene la siguiente accounttabla:
La accounttabla se asigna a la Accountentidad de esta manera:
Los atributos básicos entidad se asignan a las columnas de las tablas, así como propiedades id, iban, centsson atributos básicos.
Pero el dollars, interestCentsy interestDollarsson propiedades computarizada, para que ellos con anotaciones @Transientpara excluirlos de SELECT, INSERT, UPDATE y DELETE sentencias SQL.
Por lo tanto, para los atributos básicos, debe usar @Transientpara excluir una propiedad dada de ser persistente.
Para obtener más detalles sobre los atributos de entidad calculados, consulte este artículo .
Asociaciones
Suponiendo que tiene lo siguiente posty las post_commenttablas:
Desea asignar la lastestCommentasociación en la Postentidad a la última PostCommententidad que se agregó.
Para hacer eso, puedes usar la @JoinFormulaanotación:
@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}
Al recuperar la Postentidad, puede ver que latestCommentse recupera, pero si desea modificarla, el cambio se ignorará.
Por lo tanto, para las asociaciones, puede usar @JoinFormulapara ignorar las operaciones de escritura mientras todavía permite leer la asociación.
Para obtener más detalles sobre las asociaciones calculadas, consulte este artículo .
@MapsId
Otra forma de ignorar las asociaciones que ya están asignadas por el identificador de entidad es usar @MapsId.
Por ejemplo, considere la siguiente relación de tabla uno a uno:
La PostDetailsentidad se mapea así:
@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}
Observe que tanto el idatributo como la postasociación asignan la misma columna de la base de datos, que es la post_detailscolumna Clave primaria.
Para excluir el idatributo, la @MapsIdanotación le indicará a Hibernate que la postasociación se encarga del valor de la columna Clave primaria de la tabla.
Entonces, cuando el identificador de entidad y una asociación comparten la misma columna, puede usar @MapsIdpara ignorar el atributo de identificador de entidad y usar la asociación en su lugar.
Para obtener más detalles al respecto @MapsId, consulte este artículo .
Utilizando insertable = false, updatable = false
Otra opción es utilizar insertable = false, updatable = falsepara la asociación que Hibernate desea ignorar.
Por ejemplo, podemos mapear la asociación individual anterior de esta manera:
Los atributos insertabley updatablede la @JoinColumnanotación le indicarán a Hibernate que ignore la postasociación, ya que el identificador de la entidad se ocupa de la post_idcolumna Clave primaria.
Tenga en cuenta que tanto el atributo id como la asociación posterior asignan la misma columna de la base de datos, que es la columna Clave primaria post_comment. ¿Es esto correcto en el contexto de posty post_detailstablas como ejemplo?
David
1
Gracias por verlo. Lo arreglé.
Vlad Mihalcea
3
Para completar las respuestas anteriores, tuve el caso usando un archivo de mapeo XML donde ni el @Transientni transientfuncionó ... Tuve que poner la información transitoria en el archivo xml:
Ninguna de las respuestas anteriores funcionó para mí usando Hibernate 5.2.10, Jersey 2.25.1 y Jackson 2.8.9. Finalmente encontré la respuesta (más o menos, hacen referencia a hibernate4module pero también funciona para 5) aquí . Ninguna de las anotaciones de Json funcionó en absoluto @Transient. Al parecer, Jackson2 es lo suficientemente "inteligente" como para ignorar amablemente las cosas marcadas con, a @Transientmenos que explícitamente le digas que no lo haga. La clave era agregar el módulo hibernate5 (que estaba usando para lidiar con otras anotaciones de Hibernate) y desactivar la USE_TRANSIENT_ANNOTATIONfunción en mi aplicación Jersey:
Después de probar cualquier otro método mencionado anteriormente y otros, @JsonProperty@JsonInclude@JsonSerialize + @JsonDeserializemapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));esta solución finalmente funcionó. ¡Gracias!
Para ignorar un campo, anótelo con
@Transient
para que hibernate no lo asigne.pero luego Jackson no serializará el campo cuando se convierta a JSON.
Si necesita mezclar JPA con JSON (omitido por JPA pero aún incluido en Jackson) use
@JsonInclude
:PROPINA:
También puede usar JsonInclude.Include.NON_NULL y ocultar campos en JSON durante la deserialización cuando
token == null
:fuente
@JsonInclude
no es necesario: los@Transient
campos todavía están incluidos en JSON. (Todavía tienes mi voto: la técnica en sí misma podría ser muy útil en otras circunstancias).Para ignorar un campo, anótelo con
@Transient
para que hibernate no lo asigne.Fuente: Anotaciones de Hibernate .
fuente
Esta respuesta llega un poco tarde, pero completa la respuesta.
Para evitar que un campo de una entidad persista en DB, se puede usar uno de los dos mecanismos:
@Transient : la anotación JPA que marca un campo como no persistente
palabra clave transitoria en java. Cuidado: el uso de esta palabra clave evitará que el campo se use con cualquier mecanismo de serialización de java. Entonces, si el campo debe ser serializado, será mejor que use solo laanotación @Transient .
fuente
Existen múltiples soluciones según el tipo de atributo de la entidad.
Atributos básicos
Considere que tiene la siguiente
account
tabla:La
account
tabla se asigna a laAccount
entidad de esta manera:Los atributos básicos entidad se asignan a las columnas de las tablas, así como propiedades
id
,iban
,cents
son atributos básicos.Pero el
dollars
,interestCents
yinterestDollars
son propiedades computarizada, para que ellos con anotaciones@Transient
para excluirlos de SELECT, INSERT, UPDATE y DELETE sentencias SQL.Asociaciones
Suponiendo que tiene lo siguiente
post
y laspost_comment
tablas:Desea asignar la
lastestComment
asociación en laPost
entidad a la últimaPostComment
entidad que se agregó.Para hacer eso, puedes usar la
@JoinFormula
anotación:Al recuperar la
Post
entidad, puede ver quelatestComment
se recupera, pero si desea modificarla, el cambio se ignorará.@MapsId
Otra forma de ignorar las asociaciones que ya están asignadas por el identificador de entidad es usar
@MapsId
.Por ejemplo, considere la siguiente relación de tabla uno a uno:
La
PostDetails
entidad se mapea así:Observe que tanto el
id
atributo como lapost
asociación asignan la misma columna de la base de datos, que es lapost_details
columna Clave primaria.Para excluir el
id
atributo, la@MapsId
anotación le indicará a Hibernate que lapost
asociación se encarga del valor de la columna Clave primaria de la tabla.Utilizando
insertable = false, updatable = false
Otra opción es utilizar
insertable = false, updatable = false
para la asociación que Hibernate desea ignorar.Por ejemplo, podemos mapear la asociación individual anterior de esta manera:
Los atributos
insertable
yupdatable
de la@JoinColumn
anotación le indicarán a Hibernate que ignore lapost
asociación, ya que el identificador de la entidad se ocupa de lapost_id
columna Clave primaria.fuente
post
ypost_details
tablas como ejemplo?Para completar las respuestas anteriores, tuve el caso usando un archivo de mapeo XML donde ni el
@Transient
nitransient
funcionó ... Tuve que poner la información transitoria en el archivo xml:fuente
Ninguna de las respuestas anteriores funcionó para mí usando Hibernate 5.2.10, Jersey 2.25.1 y Jackson 2.8.9. Finalmente encontré la respuesta (más o menos, hacen referencia a hibernate4module pero también funciona para 5) aquí . Ninguna de las anotaciones de Json funcionó en absoluto
@Transient
. Al parecer, Jackson2 es lo suficientemente "inteligente" como para ignorar amablemente las cosas marcadas con, a@Transient
menos que explícitamente le digas que no lo haga. La clave era agregar el módulo hibernate5 (que estaba usando para lidiar con otras anotaciones de Hibernate) y desactivar laUSE_TRANSIENT_ANNOTATION
función en mi aplicación Jersey:Aquí está la dependencia para el Hibernate5Module:
fuente
@JsonProperty
@JsonInclude
@JsonSerialize + @JsonDeserialize
mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, false));
esta solución finalmente funcionó. ¡Gracias!A veces quieres:
Utilizar
@Column(name = "columnName", insertable = false, updatable = false)
Un buen escenario es cuando una determinada columna se calcula automáticamente utilizando otros valores de columna
fuente