Pessoal tenho uma dúvida, como faço para trabalhar com views no JPA?
Dúvidas JPA e view
9 Respostas
Olá Jacquesns,
Estou com a mesma dúvida. Fiz da mesma forma que com as tabelas, ou seja, usando a annotation @Table. Contudo, obtive o seguinte erro:
…
org.hibernate.HibernateException: Missing table: VW_DOCUMENTO
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1080)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:116)
at org.hibernate.impl.SessionFactoryImpl.(SessionFactoryImpl.java:317)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:730)
… 24 more
Estou usando a implementação JPA do Hibernate e tudo funciona corretamente quando uso tabelas. Ademais, já verifiquei se a view VW_DOCUMENTO existe, se o usuário tem prioridade para acessar a tabela, se a classe Entity foi declarada no persistence.xml, etc. Aparentemente está tudo OK, mas ainda continuo obtendo o erro.
Me diz uma coisa, vc criou uma entidade para a View certo?
Estava estudando sobre o assunto e estava vendo o seguine código.Note o GeneratedValue e o SequenceGenerator
@Id
@GeneratedValue(generator=“GENERATE_CLIENTELA”, strategy=GenerationType.SEQUENCE)
@SequenceGenerator(name=“GERATE_CLIENTELA” , sequenceName=“financeiro.clientela_pk_clientela_seq” , allocationSize=1)
@Column(name = “pk_clientela”, nullable = false)
private Long pkClientela;
Obs1:
Para vc saber melhor sobre cada Annotation desses, visite o seguinte site: http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html
e se vc quiser realmente trabalhar com JPA tem que ter ele como favoritos rsrsrs.Cara, tira muita minhas dúvidas quando faço consulta.
Obs2:Que banco vc usa?Se estiver usando Oracle ou Postgres tem que informar o schema em @Table(…)
Outra coisa, se você descobrir me passa pf.Estou precisando d+ cara.
Olá Jacquesns,
Mas preciso usar o GeneratedValue ou o SequenceGenerator? Só quero fazer um mapeamento read-only. Estou usando o Oracle e já havia colocado a annotation Table, mas não funcionou. Olha só a minha classe. A view que estou mapeamendo existe no banco e funciona.
package model;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="VW_DOCUMENTO")
public class VwDocumento implements Serializable {
@Column(name="NM_NOME")
private String nmNome;
@Column(name="CD_USUARIO")
private BigDecimal cdUsuario;
@Id
@Column(name="NU_DOCUMENTO")
private BigDecimal nuDocumento;
//private static final long serialVersionUID = 1L;
public VwDocumento() {
super();
}
public String getNmNome() {
return this.nmNome;
}
public void setNmNome(String nmNome) {
this.nmNome = nmNome;
}
public BigDecimal getCdUsuario() {
return this.cdUsuario;
}
public void setCdUsuarioBigDecimal cdUsuario) {
this.cdUsuario = cdUsuario;
}
public BigDecimal getNuDocumento() {
return this.nuDocumento;
}
public void setNuDocumento(BigDecimal nuDocumento) {
this.nuDocumento = nuDocumento;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((nuDocumento == null) ? 0 : nuDocumento.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final VwDocumento other = (VwDocumento) obj;
if (nuDocumento == null) {
if (other.nuDocumentoo != null)
return false;
} else if (!nuDocumento.equals(other.nuDocumento))
return false;
return true;
}
}
Ademais, peguei um plugin no Eclipse para fazer esse tipo e o código gerado foi basicamente o mesmo.
Olá Jacquesns,
Encontrei o meu erro. Era o persistence.xml que tinha a seguinte tag . Quando comentei essa tag, tudo funcionou perfeitamente.
que eu lembre, de acordo com a especificação uma view é tratado como qualquer outro Entity.
dessa maneira ela vai precisar de um ID. pq vc não mapeia alguma coluna com ID?
lembre-se que ID não é PK, ID é identificador unico de um objeto. pode parecer a mesma coisa, mas são conceitos diferentes.
[]´s
"Mas preciso usar o GeneratedValue ou o SequenceGenerator?"
Olha Davin no meu caso eu achava que sim pois não tem como eu pegar um campo como identificador único entende, a lógica do banco é antiga, por isso estava pensando em gerar o identificador na própia entidade, o que não sei se da certo.
Obs: O seu código foi muito útil para o meu entidimento.
Quanto a mensagem postada por jgbt:"ID não é PK, ID é identificador unico de um objeto. pode parecer a mesma coisa, mas são conceitos diferentes."
abriu muito meus horizontes despertando o conceito.
Agora, será que fazendo o GeneratedValue e o SequenceGenerator vai?
Vou fazer alguns testes… senão vou tentar criar um generator_series na view.
Olá jacquesns,
O @GeneratedValue e o @SequenceGenerator só são necessário quando você pretende trabalhar com inserção ou atualização de dados. Destarte, só será útil se você estiver utilizando tabelas ou views materializadas. Caso contrário, não precisa.
Jgbt,
Já estou usando @Id. Ademais, o meu problema realmente era a tag no persistence.xml.
Olá davimcabral, fiquei intrigado com uma coisa.E se eu tenho uma view onde todos os campos podem
ser repitidos não havendo então um identificador único visivel, bem , mas para cada registro que esta view mostrar terá um identificador como 1- dasfasdfasdf 2-asdfasdfasd etc até N linhas.Essa númeração de linhas poderiam utilizá-las como meu identificador?Se sim, vc sabe como?
Porque este é o meu caso.
up