java - mapear - ¿JPA admite mapeo a vistas sql?
mapeo hibernate con anotaciones (3)
Actualmente estoy usando Eclipselink, pero ahora sé que la mayoría de las implementaciones de JPA han sido bastante estandarizadas. ¿Hay una forma nativa de asignar una entidad JPA a una vista? No estoy buscando insertar / actualizar, pero la pregunta es cómo manejar la anotación @Id. Cada entidad en el mundo de JPA debe tener un campo de ID, pero muchas de las vistas que he creado no se ajustan a esto. ¿Hay soporte nativo para esto en el JPA o necesito usar hacks para que funcione? He buscado mucho y he encontrado muy poca información sobre cómo hacer esto.
En mi opinión, tengo una identificación "única", así que la traduje como la identificación de la entidad. Funciona muy bien:
@Entity
@Table(name="table")
@NamedQuery(name="Table.findAll", query="SELECT n FROM Table n")
public class Table implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="column_a")
private int columnA;
He estado investigando esto por mí mismo, y encontré un truco que no estoy 100% seguro, pero parece prometedor.
En mi caso, tengo una columna FK en la vista que efectivamente puede funcionar como PK: cualquier instancia dada de ese objeto extraño solo puede ocurrir una vez en la vista. Definí dos objetos fuera de ese campo: uno se designa como ID y representa el valor bruto del campo, y el otro se designa como de solo lectura y representa el objeto al que se hace referencia.
@Id
@Column(name = "foreignid", unique = true, nullable = false)
public Long getForeignId() {
...
@OneToOne
@JoinColumn(name = "foreignid", insertable=false, updatable=false)
public ForeignObject getForeignObject() {
...
Como dije, no estoy 100% seguro en este caso (y eliminaré esta respuesta si resulta que no funciona), pero mi código ha pasado un punto crítico.
Aunque no se aplica a su situación específica, sin embargo. Y hay una excelente posibilidad de que después de 11 meses ya no te importe. :-) Qué demonios, esa insignia de "Nigromante" no solo se gana a sí misma ...
Si bien la anotación @Id
con campos de tipos soportados directamente no es la única forma de especificar la identidad de una entidad (vea @IdClass
con múltiples anotaciones @EmbeddedId
o @EmbeddedId
con @Embedded
), la especificación JPA requiere una clave primaria para cada entidad.
Dicho esto, no es necesario que las entidades usen JPA con las vistas de la base de datos. Como la asignación a una vista no es diferente de la asignación a una tabla desde una perspectiva de SQL, aún puede usar consultas nativas ( createNativeQuery
en EntityManager
) para recuperar valores escalares.