Olá povo, estou estudando sobre o Hibernate Annotation e estou com duas dúvidas:
Fiz as seguintes classes conforme a imagem abaixo.
1 - Está correta esta forma que estou pensando?
Seguindo uma apostila sobre annotation, resolvi usar essa herança com as tabelas no banco por classe concreta, ou seja, apesar da herança quero ter no banco somente duas tabelas, Aluno e Professor.
Minha dúvida é como fazer o mapeamento das classes Telefone e Endereco, sendo que elas estarão na mesma tabela do Aluno e Professor.
No banco eu tenho a seguintes tabelas:
aluno
DROP TABLE IF EXISTS `scs`.`aluno`;
CREATE TABLE `scs`.`aluno` (
`id` int(10) unsigned NOT NULL auto_increment,
`nome` varchar(50) NOT NULL,
`email` varchar(50) default NULL,
`identidade` varchar(15) default NULL,
`cpf` int(10) unsigned default NULL,
`datanascimento` date NOT NULL,
`ativo` tinyint(1) NOT NULL,
`observacao` blob,
`foto` varchar(20) default NULL,
`rua` varchar(50) default NULL,
`numero` varchar(10) default NULL,
`complemento` varchar(20) default NULL,
`bairro` varchar(30) default NULL,
`cidade` varchar(45) default NULL,
`estado` varchar(20) default NULL,
`cep` int(10) unsigned default NULL,
`foneresidencial` varchar(14) default NULL,
`fonecomercial` varchar(14) default NULL,
`fonecelular` varchar(14) default NULL,
`fonerecado` varchar(14) default NULL,
`fax` varchar(14) default NULL,
`nomedopai` varchar(50) default NULL,
`nomedamae` varchar(50) default NULL,
`nomedoresponsavel` varchar(50) default NULL,
`parentescoresponsavel` varchar(20) default NULL,
`cpfresponsavel` int(10) unsigned default NULL,
`valormensalidade` double default NULL,
`diapagamento` int(10) unsigned default NULL,
`tipocobranca` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
professor
DROP TABLE IF EXISTS `scs`.`professor`;
CREATE TABLE `scs`.`professor` (
`id` int(10) unsigned NOT NULL auto_increment,
`nome` varchar(50) NOT NULL,
`email` varchar(50) default NULL,
`identidade` varchar(15) default NULL,
`cpf` int(10) unsigned default NULL,
`datanascimento` date NOT NULL,
`ativo` tinyint(1) NOT NULL,
`observacao` blob,
`foto` varchar(20) default NULL,
`endereco` varchar(50) default NULL,
`numero` varchar(10) default NULL,
`complemento` varchar(20) default NULL,
`bairro` varchar(30) default NULL,
`cidade` varchar(45) default NULL,
`estado` varchar(20) default NULL,
`cep` int(10) unsigned default NULL,
`foneresidencial` varchar(14) default NULL,
`fonecomercial` varchar(14) default NULL,
`fonecelular` varchar(14) default NULL,
`fonerecado` varchar(14) default NULL,
`fax` varchar(14) default NULL,
`qualificacao` varchar(30) default NULL,
`especializacao` varchar(30) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
No arquivo hibernate.cfg.html eu coloquei o seguinte mapeamento das classes:
<!-- Mapeamento dos arquivos hbm -->
<mapping class="scs.model.Aluno"/>
<mapping class="scs.model.Professor"/>
Na minha classe Pessoa, ficou assim:
@MappedSuperclass
public class Pessoa {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column(name="id")
private int codigo;
@Column(name="nome",length=50)
private String nome;
@Column(name="email",length=50)
private String email;
@Column(name="identidade",length=15)
private String identidade;
@Column(name="cpf")
private String cpf;
@Column(name="datanascimento")
private String dataNascimento;
@Column (name="ativo")
private boolean ativo;
@Column (name="foto")
private String foto;
@Column (name="observacao")
private String observacao;
private Endereco endereco;
private Telefone telefone;
2 - Como eu faço o annotation de Endereco e Telefone declarado acima?
Removi as annotations desses dois atributos, pois já tentei de várias formas e não deu certo, a última usada foi OneToOne, mas dava mais erros ainda… hehe
Na classe Professor fiz da seguinte forma: (vou colocar somente ela que é menor que Aluno)
@Entity
@Table(name="professor", schema="scs")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Professor extends Pessoa{
@Column (name="qualificacao")
private String qualificacao;
@Column (name="especializacao")
private String especializacao;
public Professor(){
}
O Hibernate me retorna a seguinte exception:
[color=red]
Falha na criação da sessionFactory. Classe HibernateUtil
org.hibernate.MappingException: Could not determine type for: scs.model.Endereco, for columns: [org.hibernate.mapping.Column(endereco)]
Exception in thread “AWT-EventQueue-0” java.lang.ExceptionInInitializerError[/color]
Muito obrigado.