Mapear View no Hibernate

9 respostas
F

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 ?

9 Respostas

R

A VIEW no Hibernate é tratada como uma tabela. Então, da mesma forma que você mapeia uma tabela.

F

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 ?

R

@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.

F

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.

R

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.

F

O problema é q eu não tenho acesso pra fazer isso.
Vou solicitar e vê se fazem.
:cry:

Vlw a ajuda !

J

fdiaz2011:
O problema é q eu não tenho acesso pra fazer isso.
Vou solicitar e vê se fazem.
:cry:

Vlw a ajuda !


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.

F

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 !

F

Parece que consegui resolver !

Usei o Entity do hibernate e não do JPA 1

Criado 24 de abril de 2013
Ultima resposta 25 de abr. de 2013
Respostas 9
Participantes 3