Pessoal, tudo bem?
Tenho um cenário aqui que aparentemente seria simples de resolver, mas até agora não consegui evoluir muito.
Nosso sistema possui duas tabelas conforme mostrado a seguir:
+-------------------+ +------------------------+
| TB_CONFIG | | TB_CONFIG_LANG |
+-------------------+ +------------------------+
| Customer_Id (PK) | | Product_Id (PK)|
| Company_Id (PK) | | Config_Id (PK)|
| Product_Id (PK) | | Language_Id (PK)|
| Config_Id (PK) | | Config_Description |
| Config_Value | | Config_Hint |
+-------------------+ | Config_Help |
+------------------------+
Eu preciso realizar o Mapeamento dessas duas tabelas usando o JPA.
Na tabela TB_CONFIG, eu armazeno “configurações” dos produtos que nossa empresa disponibiliza, armazenados por cliente e empresa.
Por exemplo:
Customer_ID..: 1
Company_ID...: 100
Product_ID...: 1
Config_ID....: 'ACEITA_ACESSO_ANONIMO'
Config_Value.: 'Y'
Ja a tabela TB_CONFIG_LANG armazena as Descrições, Hints e Ajuda dos parâmetros do sistema…
Exemplo:
Product_ID........: 1
Config_ID.........: 'ACEITA_ACESSO_ANONIMO'
Language_ID.......: 'pt-BR'
Config_Description: "Informa se o sistema permite acesso anônimo ou não"
Config_Hint.......: "..."
Config_Help.......: "..."
A principio, eu imaginei fazer um relacionamento @OneToOne
da entidade que representa a tabela TB_CONFIG para a entidade que representa a tabela TB_CONFIG_LANG
, usando apenas as duas colunas que são comuns entre elas: PRODUCT_ID
e CONFIG_ID
e na consulta JPQL, passar o parametro LANGUAGE_ID
, dessa forma:
Relacionamento
@OneToOne
@JoinColumn(name = "PRODUCT_ID", referencedColumnName = "PRODUCT_ID", insertable = false, updatable = false)
@JoinColumn(name = "CONFIG_ID", referencedColumnName = "CONFIG_ID", insertable = false, updatable = false)
private ConfigurationLanguage language;
Consulta JPQL
TypedQuery<ConfigurationCompany> query = manager.createQuery("select c from ConfigurationCompany c " +
"join c.language l " +
"where c.id.customerId = :customerId " +
"and c.id.companyId = :companyId " +
"and c.id.productId = :productId " +
"and c.id.configId = :configId " +
"and l.id.languageId = :languageId", ConfigurationCompany.class);
Mas o JPA questiona justamente a coluna que está faltando no mapeamento, lançando o erro abaixo:
org.springframework.orm.jpa.JpaSystemException: referencedColumnNames(PRODUCT_ID, CONFIG_ID) of com.mycompany.api.configuration.domain.model.ConfigurationCompany.language referencing com.mycompany.api.configuration.domain.model.ConfigurationLanguage not mapped to a single property; nested exception is org.hibernate.AnnotationException: referencedColumnNames(PRODUCT_ID, CONFIG_NAME) of com.mycompany.api.configuration.domain.model.ConfigurationCompany.language referencing com.mycompany.api.configuration.domain.model.ConfigurationLanguage not mapped to a single property
Alguém pode me dar uma dica de como resolver isso?
Valeu pessoal!