Olá!
Como faço pra mapear uma view do oracle no hibernate ?
Utilizei o hibernate tools e ele fez o seguinte:
@Entity
@Table(name = "View_TIPO_ACUMULO", schema = "SCHEMA")
public class ViewTipoAcumulo implements Serializable {
//...
}
Nesse ViewTipoAcumulo ele só colocou o id e criou uma outra classe ViewTipoAcumuloId com todos os atributos que existem na view.
@Embeddable
public class ViewTipoAcumulo Id implements Serializable {
//...
}
Quando utilizo o validate do hibernate ele diz o seguinte:
Caused by: org.hibernate.HibernateException: Missing table: View_TIPO_ACUMULO
Está certo pq não é uma table e sim uma view, mas se eu faço um select direto no banco, como se fosse uma tabela, ele encontra.
Como mapear uma view no hibernate ?
A VIEW no Hibernate é tratada como uma tabela. Então, da mesma forma que você mapeia uma tabela.
Pois eh. Foi oq eu li depois na documentação.
Eu fiz alguns testes pra tentar entender oq pode estar acontecendo com esta view/tabela
Ela é a única view do sistema pq o resto é tabela mesmo.
A pessoa que criou essa view criou sem um id.
Acontece que o hibernate tools mapeou ela com @Entity e ai colocou todos os atributos da view em outra classe, como chaves do id.
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "dsGrpTipoAcum", column = @Column(name = "DS_GRP_TIPO_ACUM", nullable = false, length = 30)),
@AttributeOverride(name = "dtIncl", column = @Column(name = "DT_INCL", nullable = false, length = 7)),
@AttributeOverride(name = "dtAlter", column = @Column(name = "DT_ALTER", length = 7)),
@AttributeOverride(name = "dtInat", column = @Column(name = "DT_INAT", length = 7)),
@AttributeOverride(name = "cdUsuario", column = @Column(name = "CD_USUARIO", nullable = false, length = 30)) })
private ViewGrupoTipoAcumuloId id;
Acredito q ele fez isso pq se mapeia com @Entity é preciso ter um @Id e no banco essa view não tem id.
Oq eu fiz foi tirar o @Entity e deixar apenas o @Table.
Ele não reclamou mais só q eu não sei oq isso pode causar de problema ou restrição pro desenvolvimento.
Ainda não consegui testar pq estou vendo outra necessidade.
Que restrições eu teria se tivesse apenas um @Table sem @Entity ?
@Table referencia a qual tabela está sendo mapeada.
@Entity referencia ao JPA que a classe será uma entidade.
Se você deixar sem o @Entity, acho que não vai conseguir trabalhar com o hibernate na classe.
Eu nunca fiz view sem id, então realmente não sei como seria nesse caso. Mas se as classes foram criadas da forma que você falou, deixe assim e faça os testes antes de fazer qualquer mudança.
Se eu deixar conforme o hibernate tools criou dá o erro q disse.
Caused by: org.hibernate.HibernateException: Missing table: View_TIPO_ACUMULO
Ele encontra, se eu pesquiso direto no banco: SELECT * FROM SCHEMA.View_TIPO_ACUMULO
E no banco eu me logo pelo mesmo usuario da aplicação.
Não sei pq está acontecendo isso na aplicação.
A única explicação q pensei seria de não ter um id na view e na entidade ter.
O Hibernate sempre trabalha com um id.
O que você pode fazer, é excluir a view do banco e criar uma nova view que contenha um id. Como é uma view, você não perderá dados se excluir. Ou tentar criar um alter table adicionando um id auto incremento.
O problema é q eu não tenho acesso pra fazer isso.
Vou solicitar e vê se fazem.
Vlw a ajuda !
[quote=fdiaz2011]O problema é q eu não tenho acesso pra fazer isso.
Vou solicitar e vê se fazem.
Vlw a ajuda ![/quote]
Se não aceitarem faz isso no table: (SELECT ROWNUM AS ID, V.* FROM SCHEMA.View_TIPO_ACUMULO V)
Ou simplesmente faça o SQL dentro da sua própria aplicação com native named SQL. Ficar dependendo de banco pra essas coisas é ruim, a não ser que a view sirva para outros projetos que não são da sua equipe.
Agora tem um Id lá, mas mesmo assim está dando o seguinte erro:
Caused by: org.hibernate.HibernateException: Missing table: V_GRUPO_TIPO_ACUMULO
Ele não acha a view !
Parece que consegui resolver !
Usei o Entity do hibernate e não do JPA 1