java - update - ¿Es posible tener campos inmutables en Hibernate/JPA?
update save jpa (5)
En JPA 2.0 tiene dos formas de definir qué atributos deben persistir:
- Acceso (CAMPO) - los nombres de los campos son persistentes,
- Acceso (PROPIEDAD): el nombre de las propiedades se conserva.
Si no se utiliza ninguna anotación de acceso (-), la decisión de qué acceso se utilizará depende de dónde coloque su anotación @Id. Si lo coloca junto a su campo, se utilizará Acceso (CAMPO). Si lo coloca junto a su descriptor de acceso, se utilizará Access (PROPERTY).
Por lo tanto, si usa Access (FIELD) no tiene que tener un descriptor de acceso de estilo JavaBeans apropiado para un campo en particular. Puede tener un campo privado llamado ''myField'' y un configurador público para que se llame ''público setBlahBlah (-)''. El JPA persistirá solo el ''myField''.
En nuestra aplicación, necesitamos tener campos que sean asignables una sola vez.
Al principio, pensamos en encapsular los campos y hacer que los setters sean privados. Sin embargo, algunas preguntas suscitan:
- Sin un configurador público, ¿Hibernate aún puede asignar el campo desde la base de datos?
- ¿Puedo eliminar el setter y hacer que el campo sea mutable solo en el constructor de entidades?
- Finalmente, ¿hay alguna forma estándar de JPA para hacer que un campo sea inmutable?
Gracias por adelantado.
Puede marcar una entidad con @Entity(mutable=false)
o @Immutable
para que el marco haga uso de este hecho para aumentar el rendimiento en el almacenamiento en caché y demás. (Hibernar)
Entonces puedes usar una clase de envoltura inmutable como esta:
public class ImmutableStuff {
private final FooField barValue;
public ImmutableStuff(Stuff stuff) {
barValue = stuff.barValue;
}
public FooField getBarValue(){
return barValue;
}
}
Tratar
@Column(updatable = false)
De javadoc:
Si la columna está incluida en las sentencias SQL UPDATE generadas por el proveedor de persistencia.
Tratar
@Column(updatable = false)
Y haz que tu setter sea privado. (Deja tu getter público si quieres)
Creo que esta es la mejor práctica.
PS: JPA utiliza el acceso a campos si realiza anotaciones en sus campos y utiliza el acceso a getter / setter si realiza anotaciones a su método getter.
Anuncio. 1: Creo que JPA usa campos privados simples tanto para leer como para escribir si las anotaciones se colocan en campos y no en captadores. Recientemente descubrí que Hibernate como proveedor de JPA subyacente ni siquiera necesita los métodos
get*()
yset*()
. Esta fue una solución realmente esclarecedora, ya que desde el principio pensé que Hibernate necesita personas con acceso. Entonces, la respuesta es: no necesita instaladores en lo que respecta a Hibernate.Anuncio. 2: Sin embargo, tenga en cuenta que Hibernate todavía necesita un constructor sin argumentos, de lo contrario no podrá cargar las entidades con una excepción descriptiva. Este es también un requisito de la APP.
Anuncio. 3: No, no hay. Recuerda que tus colecciones también tendrían que ser inmutables.