Tengo una pregunta similar a @ManyToMany without join table (legacy database) con un problema adicional.Asignación de una base de datos de solo lectura con una relación de varios a varios sin una tabla de unión
que tienen dos mesas A
y B
A
con una llave múltiple columna primaria (ID
yID2
)B
con una clave de múltiples columna primaria (ID
yID3
)
Una fila en A
puede hacer referencia a varias filas en B
(B.ID = A.ID
) y una fila en B
se puede hacer referencia por varias filas en A
.
EDIT: la base de datos es una base de datos heredada de solo lectura que no puedo cambiar. No necesito mapear las relaciones con JPA (podría hacerlo en mi lógica de programa con selecciones adicionales) pero sería bueno.
Básicamente es una relación de muchos a muchos sin una tabla de unión. Dado que, en cuanto a la pregunta vinculada, solo tengo que leer las tablas, probé con dos relaciones uno a muchos en ambas clases.
El problema adicional que tengo es que ambos ID
s utilizados para la unión no son la clave principal.
tengo las siguientes clases:
@Entity
@Table(name = "A")
@IdClass(PrimaryKeysA.class)
public class A {
@Id
@Column(name = "ID", insertable = false, updatable = false, columnDefinition = "char")
private String id;
@Id
@Column(name = "ID2", insertable = false, updatable = false)
private int id2;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ID", columnDefinition = "char", referencedColumnName = "ID")
private Set<B> setOfBs;
}
@Entity
@Table(name = "B")
@IdClass(PrimaryKeysB.class)
public class B {
@Id
@Column(name = "ID", insertable = false, updatable = false, columnDefinition = "char")
private String id;
@Id
@Column(name = "ID3", insertable = false, updatable = false)
private int id3;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ID", columnDefinition = "char", referencedColumnName = "ID")
private Set<A> setOfAs;
}
Hibernate genera el siguiente error:
Exception while preparing the app : referencedColumnNames(ID) of package.B referencing package.A not mapped to a single property
Realmente no me sale el mensaje: B.id
hace referencia a una sola propiedad en A
(A.id
) .
EDIT: conforme a lo solicitado:
public class PrimaryKeysA implements Serializable {
private static final long serialVersionUID = 1L;
private int id1;
private int id2;
// getters/setters/equals/hashcode
}
PrimaryKeysB
es similar con ID3 en lugar de ID2. Ambas clases A
y B
son ejemplos simplificados (anónimos).
Realmente no veo cómo puede tener muchos con muchos en estas tablas. A.ID hace referencia a B.ID y B.ID es la clave principal de B. Entonces, una A determinada solo puede hacer referencia a una B. Simplemente tienes una asociación ManyToOne de la A a la B. –
Ooops, siento que tengo lo mismo en A como en B. Editaré la pregunta (traté de generar un ejemplo simplificado yendo también ahora) – Matteo
Esta no es una asociación de muchos a muchos entre dos tablas ... ¿Por qué estás usando dos identificadores en cada mesa? ¿Tiene la capacidad de cambiar este esquema en una forma más estándar o se trata de una base de datos heredada? Si no es una base de datos heredada, ¿cuál es el motivo por el que no utiliza una tabla de combinación si desea una asociación de muchos a muchos? –