2011-03-23 18 views
10

Tengo que aplicar JPA en una base de datos heredada con un diseño horrible. Desafortunadamente no es posible cambiarlo. Afortunadamente es solo para acceso de solo lectura.@ManyToMany sin tabla de unión (base de datos heredada)

Una de las cosas más extrañas que encontré es una relación de "muchos a muchos" sin una tabla de unión (o intermedio). Esta es una simplificación de la estructura de la tabla:

USER      ACCESS 
----      ------ 
ID int primary key  ID int primary key 
NAME varchar2(20)   NAME varchar2(20) 
ACCESS_GROUP int   ACCESS_GROUP int 
  • columnas ACCESS_GROUP pueden repetirse en ambas tablas
  • un usuario puede estar relacionado con N ACCESO
  • Uno de acceso puede estar relacionado con N USUARIO

"conceptualmente" este tablas deben ser mapeados con las clases de Java de esta manera:

public class User { 
    private Integer id; 
    private String name; 
    @ManyToMany private List<Access> accessList; 
} 

public class Access { 
    private Integer id; 
    private String name; 
    @ManyToMany private List<User> userList; 
} 

Pero creo que esto no es posible. ¿Cuál cree que es el mejor enfoque para acceder a estas tablas en JPA y navegar a través de ellas?

+0

En realidad, esto no es un H: M. ¿Cómo se almacena que una fila de Usuario o Acceso es parte de dos grupos de acceso? La única manera de lograr eso sería duplicar las otras columnas (que no sean PK) y en ese caso, desde la perspectiva del diseño, son entidades diferentes. En cambio, lo que tienes son dos relaciones 1: M independientes. – Thomas

Respuesta

8

Puede intenta asignar como dos de sólo lectura uno-a-muchas relaciones:

public class User { 
    @Column(name = "ACCESS_GROUP") 
    private Integer group; 

    @OneToMany 
    @JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP", 
     insertable = false, updateable = false) 
    private List<Access> accessList; 
    ... 
} 

public class Access { 
    @Column(name = "ACCESS_GROUP") 
    private Integer group; 

    @OneToMany 
    @JoinColumn(name = "ACCESS_GROUP", referencedColumnName = "ACCESS_GROUP", 
     insertable = false, updateable = false) 
    private List<User> userList; 
    ... 
} 
+0

He intentado cosas muy similares sin éxito. Tal vez mi problema es que no declare "grupo entero" en ambos lados. ¡Gracias! – sinuhepop

+0

¿no agregará esto una nueva restricción única en ACCESS_GROUP? – fireants

Cuestiones relacionadas