example curso java jpa

java - curso - ¿Cómo reemplazar un @JoinColumn con un valor codificado?



jpa pdf (2)

Para más contexto, vea mi otra pregunta .

Quiero unirme a la clase de entidad de mi Employee clase de entidad Code , pero el Código PK es compuesto (DOMINIO, CÓDIGO) porque enumera muchos dominios de código diferentes, pero los códigos que entran en la clase / tabla Empleado son todos de un solo dominio. eliminando la necesidad de tener un campo de dominio en la clase / tabla Empleado (porque siempre sería el mismo).

¿Puedo unirme a Employee to Code utilizando el campo CODE en la tabla Employee y un valor codificado (por ejemplo, EMP_TYPE ) en lugar de una columna redundante?

Si mi clase / tabla Employee realmente tuviera esa columna redundante, me uniría a ella de esta manera:

@JoinColumns({ @JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"), @JoinColumn(name = "DOMAIN", referencedColumnName = "DOMAIN)}) @ManyToOne(optional = false) private Code sharedStatute;

pero REALMENTE no quiero tener esa columna adicional en el DB y en la clase porque siempre será la misma.

Lo que estoy tratando de lograr sería equivalente a lo siguiente en SQL:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type FROM Employee e JOIN Code c ON e.emp_type_code = c.code WHERE c.domain = ''EMP_TYPE''

en lugar de agregar un domain campo en la tabla Empleado y llenar CADA REGISTRO INDIVIDUAL con el mismo valor (''EMP_TYPE'') y luego hacer:

SELECT e.emp_id, e.first_name, e.last_name, c.description as emp_type FROM Employee e JOIN Code c ON e.emp_type_code = c.code AND e.domain = c.domain

El primero es más eficiente porque me evita tener que tener un campo redundante. Entonces, lo que trato de hacer es lo mismo pero en JPA .

Algunos de ustedes pueden decir algo sobre el efecto de "por qué no tener una tabla de búsqueda separada para cada código", pero creo que es una idea terrible y causa abarrotar las tablas de DB y las correspondientes entidades de aplicación. Es mucho mejor tener una sola tabla de búsqueda de código dividida por tipo de código (o dominio).


¿Esto debería funcionar?

@JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE") @Where(clause = "domain = ''EMP_TYPE''") @ManyToOne(optional = false) private Code sharedStatute;


Hay una forma de hacerlo con las anotaciones javax.persistence solamente:

@JoinColumns({ @JoinColumn(name = "EMP_TYPE_CODE", referencedColumnName = "CODE"), @JoinColumn(name = "CODE_TABLE_NAME.DOMAIN", referencedColumnName = ''EMP_TYPE'')}) @ManyToOne(optional = false) private Code sharedStatute;

Tenga en cuenta las comillas simples en el nombre de columna referenciado, este es el valor de cadena que está buscando.

Lo siento, ya no sé dónde encontré esta solución.

Sin embargo, si tiene múltiples objetos de código en su entidad, la unión en DOMAIN solo se realizará una vez en jpa, lo que arroja malos resultados. En este momento evito esto haciendo que esos campos se carguen perezosamente, pero eso no es ideal.