Autor
Mensagem
Esse join não funciona. É meu primeiro contato com HQL.
Como devo fazer para que funcione? O erro abaixo
#Código
Query query = getEntityManager().createQuery(" from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and idprofessor = 2 order by esc.nome");
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and idprofessor = 2 order by esc.nome");
Como devo fazer para que funcione? O erro abaixo
exception
javax.servlet.ServletException: org.hibernate.QueryException: could not resolve property: idprofessor of: br.com.mosaicodigital.modelo.Professor [ from br.com.mosaicodigital.modelo.Escola esc ,br.com.mosaicodigital.modelo.Matricula mat, br.com.mosaicodigital.modelo.Professor prof where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and mat.situacao = 'A' and idprofessor = 2 order by esc.nome]
root cause
java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: idprofessor of: br.com.mosaicodigital.modelo.Professor [ from br.com.mosaicodigital.modelo.Escola esc ,br.com.mosaicodigital.modelo.Matricula mat, br.com.mosaicodigital.modelo.Professor prof where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and mat.situacao = 'A' and idprofessor = 2 order by esc.nome]
root cause
org.hibernate.QueryException: could not resolve property: idprofessor of: br.com.mosaicodigital.modelo.Professor [ from br.com.mosaicodigital.modelo.Escola esc ,br.com.mosaicodigital.modelo.Matricula mat, br.com.mosaicodigital.modelo.Professor prof where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and mat.situacao = 'A' and idprofessor = 2 order by esc.nome]
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.0.1 logs.
#Código
@Entity
@Table(name="professor")
@SequenceGenerator(name="seq_professor", sequenceName="professor_idprofessor_seq", allocationSize=1)
public class Professor extends Pessoa implements Serializable {
private static final long serialVersionUID = 8683441216699864995L;
//@Column(name="idprofessor")
private int idProfessor;
//@Column(name="foto")
private String foto;
private Pessoa pessoa;
public int getIdProfessor() {
return idProfessor;
}
public void setIdProfessor(int idProfessor) {
this.idProfessor = idProfessor;
}
public String getFoto() {
return foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((foto == null) ? 0 : foto.hashCode());
result = prime * result + idProfessor;
result = prime * result + ((pessoa == null) ? 0 : pessoa.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
Professor other = (Professor) obj;
if (foto == null) {
if (other.foto != null)
return false;
} else if (!foto.equals(other.foto))
return false;
if (idProfessor != other.idProfessor)
return false;
if (pessoa == null) {
if (other.pessoa != null)
return false;
} else if (!pessoa.equals(other.pessoa))
return false;
return true;
}
}
@Table(name="professor")
@SequenceGenerator(name="seq_professor", sequenceName="professor_idprofessor_seq", allocationSize=1)
public class Professor extends Pessoa implements Serializable {
private static final long serialVersionUID = 8683441216699864995L;
//@Column(name="idprofessor")
private int idProfessor;
//@Column(name="foto")
private String foto;
private Pessoa pessoa;
public int getIdProfessor() {
return idProfessor;
}
public void setIdProfessor(int idProfessor) {
this.idProfessor = idProfessor;
}
public String getFoto() {
return foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
public Pessoa getPessoa() {
return pessoa;
}
public void setPessoa(Pessoa pessoa) {
this.pessoa = pessoa;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((foto == null) ? 0 : foto.hashCode());
result = prime * result + idProfessor;
result = prime * result + ((pessoa == null) ? 0 : pessoa.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
Professor other = (Professor) obj;
if (foto == null) {
if (other.foto != null)
return false;
} else if (!foto.equals(other.foto))
return false;
if (idProfessor != other.idProfessor)
return false;
if (pessoa == null) {
if (other.pessoa != null)
return false;
} else if (!pessoa.equals(other.pessoa))
return false;
return true;
}
}
Refiz o etributo, java é Case Sensitive, mas como HQL não o é, achei que ele não se importaria com isso, mas se importou sim. Bem, fiz as correções e agora deu um novo erro. Ele diz de uma coluna no banco que não existe. Procurei onde por ventura eu faço menção a ela e não encontrei nada. Para não ficar postando todo o erro(muito grande) postei apenas,acho, o essencial.
Esse é meu select em HQL.
#Código
javax.servlet.ServletException: org.hibernate.exception.SQLGrammarException: could not execute query
org.postgresql.util.PSQLException: ERRO: coluna professor2_.tipopessoa não existe
Posição: 662
org.postgresql.util.PSQLException: ERRO: coluna professor2_.tipopessoa não existe
Posição: 662
Esse é meu select em HQL.
#Código
public List<Escola> findAll() {
Query query = getEntityManager().createQuery(" from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
}
Query query = getEntityManager().createQuery(" from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
}
Resolvi o tipopessoa. Era um ENUM que apontava para tipopessoa e na realidade o nome dessa coluna era tipo. Corrigi e agora o erro mudou para:
org.postgresql.util.PSQLException: ERRO: coluna professor2_.idprofessor não existe Posição: 692
Realmente eu não estou entendendo mais nada. A coluna idprofessor ela existe em várias entidades, várias mesmo,
pois ele é o cara principal no projeto, o professor.
Remova o comentário da sua entidade:
@Column(name="idprofessor")
private int idProfessor;
É esperado que no banco a coluna esteja com esse nome: idprofessor,
e no hql vc esqueci banco e o que está entre parênteses e coloca idProfessor, o HQL já faz o meio de campo para vc. Não é problema de join mas sim de coluna, vc está trabalhando com java e um framework ORM, não é uma chamada comum no banco.
Seu hql depois de corrigir essa parte ainda vai dar outro erro:
Query query = getEntityManager().createQuery(" from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
Vc não especificou qual tabela retornaria a consulta, qdo fosse fazer o cast no return tb talvez dê erro: que tal colocar :
Query query = getEntityManager().createQuery("select esc from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
Att Davi
@Column(name="idprofessor")
private int idProfessor;
É esperado que no banco a coluna esteja com esse nome: idprofessor,
e no hql vc esqueci banco e o que está entre parênteses e coloca idProfessor, o HQL já faz o meio de campo para vc. Não é problema de join mas sim de coluna, vc está trabalhando com java e um framework ORM, não é uma chamada comum no banco.
Seu hql depois de corrigir essa parte ainda vai dar outro erro:
Query query = getEntityManager().createQuery(" from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
Vc não especificou qual tabela retornaria a consulta, qdo fosse fazer o cast no return tb talvez dê erro: que tal colocar :
Query query = getEntityManager().createQuery("select esc from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
Att Davi
Quando rodo o join, me dá um esse erro:
Query query = getEntityManager().createQuery("select esc from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
org.postgresql.util.PSQLException: ERRO: coluna professor2_.dtype não existe Posição: 218
Eu não sei mesmo onde esse dtype aparece. Pesquisei nos meus beans, em todas as classes e nada consegui
resolver isso. Não sei de onde ele aparece. Se retiro o Join aí funciona. To pesquisando, mas não sei de onde veio esse ara.
Query query = getEntityManager().createQuery("select esc from Escola esc ,Matricula mat, Professor prof " +
" where mat.idescola = esc.idescola and mat.idprofessor = prof.idprofessor and" +
" mat.situacao = 'A' and mat.idprofessor = 2 order by esc.nome");
return (List<Escola>) query.getResultList();
Não vejo esse dtype
#Código
@Entity
@Table(name="pessoa")
@SequenceGenerator(name="seq_pessoa", sequenceName="pessoa_idpessoa_seq", allocationSize=1)
public class Pessoa implements Serializable {
private static final long serialVersionUID = -7427597435054021998L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_pessoa")
@Column(name="idPessoa")
private int idPessoa;
@Column(name="nome")
private String nome;
@Column(name="sobrenome")
private String sobrenome;
@Column(name="sexo")
private EnumSexo sexo;
@Column(name="cpf")
private String cpf;
@Column(name="telefoneComercial")
private String telefoneComercial;
@Column(name="telefoneResidencial")
private String telefoneResidencial;
@Column(name="email")
private String email;
@Column(name="tipo")
private EnumTipoPessoa tipo;
public int getIdPessoa() {
return idPessoa;
}
public void setIdPessoa(int idPessoa) {
this.idPessoa = idPessoa;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSobrenome() {
return sobrenome;
}
public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}
public EnumSexo getSexo() {
return sexo;
}
public void setSexo(EnumSexo sexo) {
this.sexo = sexo;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getTelefoneComercial() {
return telefoneComercial;
}
public void setTelefoneComercial(String telefoneComercial) {
this.telefoneComercial = telefoneComercial;
}
public String getTelefoneResidencial() {
return telefoneResidencial;
}
public void setTelefoneResidencial(String telefoneResidencial) {
this.telefoneResidencial = telefoneResidencial;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public EnumTipoPessoa getTipoPessoa() {
return tipo;
}
public void setTipoPessoa(EnumTipoPessoa tipo) {
this.tipo = tipo;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cpf == null) ? 0 : cpf.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + idPessoa;
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
result = prime * result + ((sexo == null) ? 0 : sexo.hashCode());
result = prime * result
+ ((sobrenome == null) ? 0 : sobrenome.hashCode());
result = prime
* result
+ ((telefoneComercial == null) ? 0 : telefoneComercial
.hashCode());
result = prime
* result
+ ((telefoneResidencial == null) ? 0 : telefoneResidencial
.hashCode());
result = prime * result
+ ((tipo == null) ? 0 : tipo.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;
Pessoa other = (Pessoa) obj;
if (cpf == null) {
if (other.cpf != null)
return false;
} else if (!cpf.equals(other.cpf))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (idPessoa != other.idPessoa)
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
if (sexo != other.sexo)
return false;
if (sobrenome == null) {
if (other.sobrenome != null)
return false;
} else if (!sobrenome.equals(other.sobrenome))
return false;
if (telefoneComercial == null) {
if (other.telefoneComercial != null)
return false;
} else if (!telefoneComercial.equals(other.telefoneComercial))
return false;
if (telefoneResidencial == null) {
if (other.telefoneResidencial != null)
return false;
} else if (!telefoneResidencial.equals(other.telefoneResidencial))
return false;
if (tipo != other.tipo)
return false;
return true;
}
}
@Table(name="pessoa")
@SequenceGenerator(name="seq_pessoa", sequenceName="pessoa_idpessoa_seq", allocationSize=1)
public class Pessoa implements Serializable {
private static final long serialVersionUID = -7427597435054021998L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_pessoa")
@Column(name="idPessoa")
private int idPessoa;
@Column(name="nome")
private String nome;
@Column(name="sobrenome")
private String sobrenome;
@Column(name="sexo")
private EnumSexo sexo;
@Column(name="cpf")
private String cpf;
@Column(name="telefoneComercial")
private String telefoneComercial;
@Column(name="telefoneResidencial")
private String telefoneResidencial;
@Column(name="email")
private String email;
@Column(name="tipo")
private EnumTipoPessoa tipo;
public int getIdPessoa() {
return idPessoa;
}
public void setIdPessoa(int idPessoa) {
this.idPessoa = idPessoa;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSobrenome() {
return sobrenome;
}
public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}
public EnumSexo getSexo() {
return sexo;
}
public void setSexo(EnumSexo sexo) {
this.sexo = sexo;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getTelefoneComercial() {
return telefoneComercial;
}
public void setTelefoneComercial(String telefoneComercial) {
this.telefoneComercial = telefoneComercial;
}
public String getTelefoneResidencial() {
return telefoneResidencial;
}
public void setTelefoneResidencial(String telefoneResidencial) {
this.telefoneResidencial = telefoneResidencial;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public EnumTipoPessoa getTipoPessoa() {
return tipo;
}
public void setTipoPessoa(EnumTipoPessoa tipo) {
this.tipo = tipo;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cpf == null) ? 0 : cpf.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + idPessoa;
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
result = prime * result + ((sexo == null) ? 0 : sexo.hashCode());
result = prime * result
+ ((sobrenome == null) ? 0 : sobrenome.hashCode());
result = prime
* result
+ ((telefoneComercial == null) ? 0 : telefoneComercial
.hashCode());
result = prime
* result
+ ((telefoneResidencial == null) ? 0 : telefoneResidencial
.hashCode());
result = prime * result
+ ((tipo == null) ? 0 : tipo.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;
Pessoa other = (Pessoa) obj;
if (cpf == null) {
if (other.cpf != null)
return false;
} else if (!cpf.equals(other.cpf))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (idPessoa != other.idPessoa)
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
if (sexo != other.sexo)
return false;
if (sobrenome == null) {
if (other.sobrenome != null)
return false;
} else if (!sobrenome.equals(other.sobrenome))
return false;
if (telefoneComercial == null) {
if (other.telefoneComercial != null)
return false;
} else if (!telefoneComercial.equals(other.telefoneComercial))
return false;
if (telefoneResidencial == null) {
if (other.telefoneResidencial != null)
return false;
} else if (!telefoneResidencial.equals(other.telefoneResidencial))
return false;
if (tipo != other.tipo)
return false;
return true;
}
}
cara tá estranho isso mesmo,
bom mais alguns toques,
esse serial que vc gera por conta de impleemntar Serializable, vc não cria getters e setters para ele não.
para não ter problema e o hibernate pensar que vc precisa incluí-lo no banco.
No equals e hashCode será que não seria interessante vc usar só atributo id?
Não é impossível termos situações que passemos outros atributos não, mas lembre vc tem realmente um porquê fazer isso?
Com somente o id vai ser mais performático.
Se vc quer que a coluna seja unique, tem umaforma de fazer isso:
@Table(name = "pessoa", uniqueConstraints={@javax.persistence.UniqueConstraint(columnNames={"cpf","email","nome"})})
Sexo não dá pq ai vc só vai consegui cadastrar duas pessoas no banco.
Cara posta agora seu arquivo ou classe de configuração do hibernate para ver se no console está mostarndo a consulta gerada pelo hibernate, se já estiver mostrando a consulta, posta aki a consula para verificarmos se:
bom mais alguns toques,
esse serial que vc gera por conta de impleemntar Serializable, vc não cria getters e setters para ele não.
para não ter problema e o hibernate pensar que vc precisa incluí-lo no banco.
No equals e hashCode será que não seria interessante vc usar só atributo id?
Não é impossível termos situações que passemos outros atributos não, mas lembre vc tem realmente um porquê fazer isso?
Com somente o id vai ser mais performático.
Se vc quer que a coluna seja unique, tem umaforma de fazer isso:
@Table(name = "pessoa", uniqueConstraints={@javax.persistence.UniqueConstraint(columnNames={"cpf","email","nome"})})
Sexo não dá pq ai vc só vai consegui cadastrar duas pessoas no banco.
Cara posta agora seu arquivo ou classe de configuração do hibernate para ver se no console está mostarndo a consulta gerada pelo hibernate, se já estiver mostrando a consulta, posta aki a consula para verificarmos se:
professor2_.dtype é referente a tabela professor mesmo, as vezes nasconsultas o hibernate cria uns nomes meio estranho para tabelas..
Att Davi
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="puMosaicoDigital">
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5435/Teste" />
<property name="hibernate.connection.username" value="postgres" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
A porta é a 5435 mesmo. Isso tá correto.
<persistence>
<persistence-unit name="puMosaicoDigital">
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5435/Teste" />
<property name="hibernate.connection.username" value="postgres" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
A porta é a 5435 mesmo. Isso tá correto.
Achei estranho foi o log gerado. Ele não parece ser o que deveria estar no join. Veja abaixo o log gerado
INFO: Hibernate:
select
escola0_.idescola as idescola2_,
escola0_.nome as nome2_,
escola0_.telefone as telefone2_,
escola0_.fax as fax2_,
escola0_.email as email2_
from
escola escola0_,
matricula matricula1_,
pessoa professor2_
where
professor2_.DTYPE='Professor'
and matricula1_.idescola=escola0_.idescola
and matricula1_.idprofessor=professor2_.idprofessor
and matricula1_.situacao='A'
and idprofessor=1
order by
escola0_.nome
#Código
- INFO: Hibernate:
- select
- escola0_.idescola as idescola2_,
- escola0_.nome as nome2_,
- escola0_.telefone as telefone2_,
- escola0_.fax as fax2_,
- escola0_.email as email2_
- from
- escola escola0_,
- matricula matricula1_,
- pessoa professor2_
- where
- professor2_.DTYPE='Professor'
- and matricula1_.idprofessor=professor2_.idprofessor
- and matricula1_.idescola=escola0_.idescola
- and matricula1_.situacao='A'
- and idprofessor=1
- order by
- escola0_.nome
Ok, mas tem uma coisa e não se isso se refere a herança e etc... Ao rodar no pgAdmin essa query, removi essa linha e continuou a dar erro:
professor2_.DTYPE='Professor'
O erro é que não existe a coluna professor2_.idprofessor, aí removi essa linha também e funcionou. Ou seja, nada referente a professor funciona. Pode ser isso, que o Davi falou sim e vou dar uma olhada agora, mas estranho. Essa linha tambem foi removida e ai funcionou
and matricula1_.idprofessor=professor2_.idprofessor
professor2_.DTYPE='Professor'
O erro é que não existe a coluna professor2_.idprofessor, aí removi essa linha também e funcionou. Ou seja, nada referente a professor funciona. Pode ser isso, que o Davi falou sim e vou dar uma olhada agora, mas estranho. Essa linha tambem foi removida e ai funcionou
and matricula1_.idprofessor=professor2_.idprofessor
Essa classe não está mapeada corretamente,o que fica em @Column tem que bater com o banco.
Essa é a maior exigência do Hibernate JPA, para funcionar direitim, por isso algumas vezes havia te falado que esse mapeamento não é simples e exige uma certa experiência.
Verifica com muito cuidado seu mapeamento e vai conferindo com o banco.
Mais uma dúvida minha.. na hora que a app sobe ele não demonstra nenhum erro de mapeamento?
Que tal analisarmos a possibilidade de gerarmos o banco a partir do nosso mapeamento... sria o seguinte, vc deixa seu banco intacto, mas cria outro banco com um nome parecido e altera seu arquivo de configuração para o novo banco que vc criou e pede para o hibernate gerar no seu arquivo de configuração tb...e compara os ois bancos
pq essas picuinhas de idProfessor e idprofessor.. jánão vai ter mais... e creio que seu DBA não vai reclamar se o banco gerado for o mesmo. digo tabelas e colunas
Att Davi
Essa é a maior exigência do Hibernate JPA, para funcionar direitim, por isso algumas vezes havia te falado que esse mapeamento não é simples e exige uma certa experiência.
Verifica com muito cuidado seu mapeamento e vai conferindo com o banco.
Mais uma dúvida minha.. na hora que a app sobe ele não demonstra nenhum erro de mapeamento?
Que tal analisarmos a possibilidade de gerarmos o banco a partir do nosso mapeamento... sria o seguinte, vc deixa seu banco intacto, mas cria outro banco com um nome parecido e altera seu arquivo de configuração para o novo banco que vc criou e pede para o hibernate gerar no seu arquivo de configuração tb...e compara os ois bancos
pq essas picuinhas de idProfessor e idprofessor.. jánão vai ter mais... e creio que seu DBA não vai reclamar se o banco gerado for o mesmo. digo tabelas e colunas
Att Davi
Vish cara :/
aqui tb não consigo, se conseguisse copiaava e colava em um microsoftword... :/
Bom só mais um toque para sua app gerar o banco vc faz a seguinte alteração:
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="puMosaicoDigital">
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5435/NovoBanco" />
<property name="hibernate.connection.username" value="postgres" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
obviamente que vc vai ter que pelo menos criar esse banco no postgresql...só criar o banco mesmo, vazio sem nada.
Compara os dois bancos.
Att Davi
aqui tb não consigo, se conseguisse copiaava e colava em um microsoftword... :/
Bom só mais um toque para sua app gerar o banco vc faz a seguinte alteração:
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
<persistence-unit name="puMosaicoDigital">
<properties>
<property name="hibernate.archive.autodetection" value="class, hbm" />
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5435/NovoBanco" />
<property name="hibernate.connection.username" value="postgres" />
<property name="hibernate.connection.password" value="123456" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
obviamente que vc vai ter que pelo menos criar esse banco no postgresql...só criar o banco mesmo, vazio sem nada.
Compara os dois bancos.
Att Davi
vc cria um banco no postgres do jeito que quiser...com o nome por exemplo Teste2...
só faz isso.. cria só colocando o nome e deixa lá.
vc adiciona essa linhas em destaque do post que te passei e altera novoBanco pelo nome que vc criou o banco no postgres e add essa linha nesse arquivo:
<property name="hibernate.hbm2ddl.auto" value="update" />
A própria app vai gerar o bancopara vc (tabelas e colunas)
Att Davi
só faz isso.. cria só colocando o nome e deixa lá.
vc adiciona essa linhas em destaque do post que te passei e altera novoBanco pelo nome que vc criou o banco no postgres e add essa linha nesse arquivo:
<property name="hibernate.hbm2ddl.auto" value="update" />
A própria app vai gerar o bancopara vc (tabelas e colunas)
Att Davi
Trabalha eu e meu amigo aqui. Nós mudamos as classes Pessoa e Professor e ficou assim:
#Código
@Entity
@Table(name="professor")
@PrimaryKeyJoinColumn(name="idpessoa")
public class Professor extends Pessoa {
@Column(name="foto")
private String foto;
public String getFoto() {
return foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
}
@Table(name="professor")
@PrimaryKeyJoinColumn(name="idpessoa")
public class Professor extends Pessoa {
@Column(name="foto")
private String foto;
public String getFoto() {
return foto;
}
public void setFoto(String foto) {
this.foto = foto;
}
}
#Código
@Entity
@Table(name="pessoa")
@Inheritance(strategy=InheritanceType.JOINED)
@SequenceGenerator(name="seq_pessoa", sequenceName="pessoa_idpessoa_seq", allocationSize=1)
public class Pessoa {
@Id
@Column(name="idPessoa")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_pessoa")
private int idPessoa;
@Column(name="nome")
private String nome;
@Column(name="sobrenome")
private String sobrenome;
@Enumerated(EnumType.STRING)
private EnumSexo sexo;
@Column(name="cpf")
private String cpf;
@Column(name="telefoneComercial")
private String telefoneComercial;
@Column(name="telefoneResidencial")
private String telefoneResidencial;
@Column(name="email")
private String email;
@Enumerated(EnumType.STRING)
private EnumTipoPessoa tipo;
@OneToOne(mappedBy="pessoa")
private Login login;
public int getIdPessoa() {
return idPessoa;
}
public void setIdPessoa(int idPessoa) {
this.idPessoa = idPessoa;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSobrenome() {
return sobrenome;
}
public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}
public EnumSexo getSexo() {
return sexo;
}
public void setSexo(EnumSexo sexo) {
this.sexo = sexo;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getTelefoneComercial() {
return telefoneComercial;
}
public void setTelefoneComercial(String telefoneComercial) {
this.telefoneComercial = telefoneComercial;
}
public String getTelefoneResidencial() {
return telefoneResidencial;
}
public void setTelefoneResidencial(String telefoneResidencial) {
this.telefoneResidencial = telefoneResidencial;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public EnumTipoPessoa getTipoPessoa() {
return tipo;
}
public void setTipoPessoa(EnumTipoPessoa tipo) {
this.tipo = tipo;
}
public Login getLogin() {
return login;
}
public void setLogin(Login login) {
this.login = login;
}
}
@Table(name="pessoa")
@Inheritance(strategy=InheritanceType.JOINED)
@SequenceGenerator(name="seq_pessoa", sequenceName="pessoa_idpessoa_seq", allocationSize=1)
public class Pessoa {
@Id
@Column(name="idPessoa")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_pessoa")
private int idPessoa;
@Column(name="nome")
private String nome;
@Column(name="sobrenome")
private String sobrenome;
@Enumerated(EnumType.STRING)
private EnumSexo sexo;
@Column(name="cpf")
private String cpf;
@Column(name="telefoneComercial")
private String telefoneComercial;
@Column(name="telefoneResidencial")
private String telefoneResidencial;
@Column(name="email")
private String email;
@Enumerated(EnumType.STRING)
private EnumTipoPessoa tipo;
@OneToOne(mappedBy="pessoa")
private Login login;
public int getIdPessoa() {
return idPessoa;
}
public void setIdPessoa(int idPessoa) {
this.idPessoa = idPessoa;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getSobrenome() {
return sobrenome;
}
public void setSobrenome(String sobrenome) {
this.sobrenome = sobrenome;
}
public EnumSexo getSexo() {
return sexo;
}
public void setSexo(EnumSexo sexo) {
this.sexo = sexo;
}
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getTelefoneComercial() {
return telefoneComercial;
}
public void setTelefoneComercial(String telefoneComercial) {
this.telefoneComercial = telefoneComercial;
}
public String getTelefoneResidencial() {
return telefoneResidencial;
}
public void setTelefoneResidencial(String telefoneResidencial) {
this.telefoneResidencial = telefoneResidencial;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public EnumTipoPessoa getTipoPessoa() {
return tipo;
}
public void setTipoPessoa(EnumTipoPessoa tipo) {
this.tipo = tipo;
}
public Login getLogin() {
return login;
}
public void setLogin(Login login) {
this.login = login;
}
}
Dei uma nalisada melhor, vc só colocou foto na classe Professor, reveja isso também.
Os atributos que são específicos de professor devem ser declarados na sua própria classe.
Os outros que são genéricos de Pessoa ficam em pessoa mesmo, vc pode até manter o id de professor sem problemas, daio banco vai criar o id de pessoa (chave estrangeira) na tabelaprofessor.
Att Davi
Os atributos que são específicos de professor devem ser declarados na sua própria classe.
Os outros que são genéricos de Pessoa ficam em pessoa mesmo, vc pode até manter o id de professor sem problemas, daio banco vai criar o id de pessoa (chave estrangeira) na tabelaprofessor.
Att Davi







