Java tiene la transient
palabra clave. ¿Por qué JPA tiene en @Transient
lugar de simplemente usar la palabra clave java ya existente?
java
jpa
jakarta-ee
annotations
transient
deamon
fuente
fuente
Porque tienen diferentes significados. La
@Transient
anotación le dice al proveedor de JPA que no persista ningúntransient
atributo (no ). El otro le dice al marco de serialización que no serialice un atributo. Es posible que desee tener una@Transient
propiedad y aún así serializarla.fuente
Como otros han dicho,
@Transient
se usa para marcar campos que no deberían persistirse. Considere este breve ejemplo:Cuando esta clase se alimenta al JPA, persiste
gender
yid
no intenta persistir los métodos booleanos auxiliares; sin@Transient
el sistema subyacente se quejaría de quePerson
faltan la clase EntitysetMale()
y lossetFemale()
métodos y, por lo tanto, no persistiríanPerson
en absoluto.fuente
El propósito es diferente:
La
transient
palabra clave y la@Transient
anotación tienen dos propósitos diferentes: uno trata con la serialización y otro con la persistencia . Como programadores, a menudo combinamos estos dos conceptos en uno solo, pero esto no es exacto en general. La persistencia se refiere a la característica del estado que sobrevive al proceso que lo creó. La serialización en Java se refiere al proceso de codificación / decodificación del estado de un objeto como una secuencia de bytes.La
transient
palabra clave es una condición más fuerte que@Transient
:Si un campo usa la
transient
palabra clave, ese campo no se serializará cuando el objeto se convierta en una secuencia de bytes. Además, dado que JPA trata los campos marcados con latransient
palabra clave como teniendo la@Transient
anotación, JPA tampoco persistirá en el campo.Por otro lado, los campos anotados
@Transient
solo se convertirán en una secuencia de bytes cuando el objeto se serialice, pero JPA no lo persistirá. Por lo tanto, latransient
palabra clave es una condición más fuerte que la@Transient
anotación.Ejemplo
Esto plantea la pregunta: ¿Por qué alguien querría serializar un campo que no se conserva en la base de datos de la aplicación? La realidad es que la serialización se usa para algo más que la persistencia . En una aplicación Enterprise Java, debe existir un mecanismo para intercambiar objetos entre componentes distribuidos ; la serialización proporciona un protocolo de comunicación común para manejar esto. Por lo tanto, un campo puede contener información crítica con el fin de la comunicación entre componentes; pero ese mismo campo puede no tener valor desde una perspectiva de persistencia.
Por ejemplo, suponga que se ejecuta un algoritmo de optimización en un servidor y suponga que este algoritmo tarda varias horas en completarse. Para un cliente, es importante tener el conjunto de soluciones más actualizado. Por lo tanto, un cliente puede suscribirse al servidor y recibir actualizaciones periódicas durante la fase de ejecución del algoritmo. Estas actualizaciones se proporcionan utilizando el
ProgressReport
objeto:La
Solution
clase podría verse así:El servidor persiste cada uno
ProgressReport
en su base de datos. Al servidor no le importa persistirestimatedMinutesRemaining
, pero el cliente ciertamente se preocupa por esta información. Por lo tanto,estimatedMinutesRemaining
se anota usando@Transient
. Cuando elSolution
algoritmo localiza el final , JPA lo persiste directamente sin usar aProgressReport
.fuente
@Unpersisted
.@Ephemeral
. Según Merriam Webster: cuando lo efímero se imprimió por primera vez en inglés en el siglo XVII, "era un término científico aplicado a las fiebres a corto plazo y, más tarde, a organismos (como insectos y flores) con una vida muy corta. Poco después de eso , adquirió un sentido extendido que se refiere a cualquier cosa fugaz y de corta duración (como en "placeres efímeros") ".transient
campos tienen implícitamente la@Transient
anotación. Entonces, si usa latransient
palabra clave para evitar la serialización de un campo, tampoco terminará en la base de datos.Si solo desea que un campo no sea persistente, tanto el transitorio como el @Transient funcionan. Pero la pregunta es por qué @Transient ya que el transitorio ya existe.
¡Porque el campo @Transient todavía se serializará!
Supongamos que crea una entidad, que realiza algunos cálculos que consumen CPU para obtener un resultado y este resultado no se guardará en la base de datos. Pero si desea enviar la entidad a otras aplicaciones Java para que las use JMS, debe usar
@Transient
, no la palabra clave JavaSEtransient
. Por lo tanto, los receptores que se ejecutan en otras máquinas virtuales pueden ahorrar su tiempo para volver a calcular.fuente
Trataré de responder la pregunta de "por qué". Imagine una situación en la que tiene una gran base de datos con muchas columnas en una tabla, y su proyecto / sistema utiliza herramientas para generar entidades a partir de la base de datos. (Hibernate tiene esos, etc ...) Ahora, suponga que por su lógica de negocios necesita un campo en particular que NO persista. Tiene que "configurar" su entidad de una manera particular. Si bien la palabra clave Transient funciona en un objeto, ya que se comporta dentro de un lenguaje java, el @Transient solo está diseñado para responder a las tareas que pertenecen solo a tareas de persistencia.
fuente