2009-03-13 28 views
27

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.¿JPA admite el mapeo de vistas sql?

+0

Vistas funciones como tablas normales, por eso si usted vistas no encaja bien con la APP ORM mapeo en su lugar puede utilizar un procedimiento almacenado para devolver un cursor personalizado formado a partir de la vista (s). Puede asignar procedimientos almacenados en EclipseLink usando la anotación @NamedStoredProcedureQuery. Para obtener más información sobre este Google para "Extensiones EclipseLink". –

Respuesta

7

Durante el uso de la anotación @Id con los campos de tipos soportados directamente no es la única manera de especificar la identidad de una entidad (ver @IdClass con múltiples @Id anotaciones 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.

0

He estado investigando esto por mí mismo, y he encontrado un truco que no estoy 100% seguro pero funciona 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 he dicho, no estoy 100% seguro en este caso (y sólo voy a borrar esta respuesta si resulta que no trabajar), pero tiene mi código más allá de un punto de choque en particular.

No obstante, si se aplica a su situación específica. 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 ...

0

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; 
Cuestiones relacionadas