Tengo una situación en la que necesito unir tablas en un objeto en una jerarquía de clase ORM donde la columna de combinación NO es la clave principal de la clase base. Este es un ejemplo del diseño de la tabla:¿Cómo puedo unir tablas en columnas de clave no primaria en tablas secundarias?
CREATE TABLE APP.FOO
(
FOO_ID INTEGER NOT NULL,
TYPE_ID INTEGER NOT NULL,
PRIMARY KEY(FOO_ID)
)
CREATE TABLE APP.BAR
(
FOO_ID INTEGER NOT NULL,
BAR_ID INTEGER NOT NULL,
PRIMARY KEY(BAR_ID),
CONSTRAINT bar_fk FOREIGN KEY(FOO_ID) REFERENCES APP.FOO(FOO_ID)
)
CREATE TABLE APP.BAR_NAMES
(
BAR_ID INTEGER NOT NULL,
BAR_NAME VARCHAR(128) NOT NULL,
PRIMARY KEY(BAR_ID, BAR_NAME),
CONSTRAINT bar_names_fk FOREIGN KEY(BAR_ID) REFERENCES APP.BAR(BAR_ID)
)
Y aquí están las asignaciones (captadores y definidores eliminadas por razones de brevedad
@Entity
@Table(name = "FOO")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE_ID", discriminatorType = javax.persistence.DiscriminatorType.INTEGER)
public abstract class Foo {
@Id
@Column(name = "FOO_ID")
private Long fooId;
}
@Entity
@DiscriminatorValue("1")
@SecondaryTable(name = "BAR", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "FOO_ID", referencedColumnName = "FOO_ID") })
public class Bar extends Foo{
@Column(table = "BAR", name = "BAR_ID")
Long barId;
}
¿Cómo puedo agregar la asignación de BAR_NAMES
dado que su unirse a la columna no está FOO_ID
, pero BAR_ID
he intentado lo siguiente:?
@CollectionOfElements(fetch = FetchType.LAZY)
@Column(name = "BAR_NAME")
@JoinTable(name = "BAR_NAMES", joinColumns = @JoinColumn(table = "BAR", name = "BAR_ID", referencedColumnName="BAR_ID"))
List<String> names = new ArrayList<String>();
esto falla porque el SQL para recuperar el objeto Barra trata de obtener un valor BAR_ID de la mesa FOO. También he intentado reemplazar la anotación joinTable con
@JoinTable(name = "BAR_NAMES", joinColumns = @JoinColumn(name = "BAR_ID"))
Esto produce ningún error SQL, sino que también recupera ningún dato porque la consulta contra BAR_NAMES está utilizando el FOO_ID como el valor unirse en lugar de la BAR_ID.
Para propósitos de prueba, he poblaron la base de datos con los siguientes comandos
insert into FOO (FOO_ID, TYPE_ID) values (10, 1);
insert into BAR (FOO_ID, BAR_ID) values (10, 20);
insert into BAR_NAMES (BAR_ID, BAR_NAME) values (20, 'HELLO');
Muchas de las soluciones que parecen trabajar volverán una colección vacía al conseguir objeto de Foo ID 10 (en oposición a una colección que contiene 1 nombre)
'barId' todavía está marcado con' @ Id', ¿cuál es la diferencia? – deathangel908