1
resposta

Relacionamento de table com view no Hibernate

Boa tarde!

Tive que mapear no meu projeto algumas views e estou com dificuldades no relacionamento destas com outras entidades. Segue um exemplo:

A table:

@Entity
public class Pesquisa {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    @JoinColumn(name = "uor", foreignKey = @ForeignKey(name = "none"))
    private MstDados dependencia;

A view:

@Entity
@Immutable
public class MstDados {

    @Id
    private Integer uor;

    private String matriculaGestor;
    @OneToMany(mappedBy="dependencia")
    private List<Pesquisa> pesquisa;

Quando eu vou carregar o projeto o console me devolve a seguinte mensagem:

Hibernate: 

    alter table Pesquisa 
       add constraint FK9forew21fg0axqvps5sx6xv6x 
       foreign key (uor) 
       references MstDados (uor)
fev 04, 2021 1:45:14 PM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Error executing DDL "
    alter table Pesquisa 
       add constraint FK9forew21fg0axqvps5sx6xv6x 
       foreign key (uor) 
       references MstDados (uor)" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL "
    alter table Pesquisa 
       add constraint FK9forew21fg0axqvps5sx6xv6x 
       foreign key (uor) 
       references MstDados (uor)" via JDBC Statement
...

Alguém sabe se existe uma maneira de relacionar essas entidades?

Abraço!

1 resposta

Olá, tudo bem?

No Hibernate, o relacionamento entre uma tabela (entity) e uma view é possível, mas existem algumas considerações a serem feitas.

No seu exemplo, você está tentando mapear o relacionamento entre a tabela Pesquisa e a view MstDados. No entanto, o Hibernate está tentando criar uma restrição de chave estrangeira (foreign key) entre elas, o que não é possível, pois uma view não pode ter restrições de chave estrangeira.

Se a view for apenas para leitura e não precisar de atualizações ou inserções, uma possível solução é você usar a anotação @Subselect do Hibernate para mapear a view como uma entidade de leitura apenas. Nesse caso, você não precisará do relacionamento com a tabela Pesquisa.