Olá a todos,
Estou tentando usar herança no hibernate + annotations mais num ta rolando, ja olhei o tutorial e nada.
Tenho uma classe Pessoa é superclasse de Aluno e User. Na classe pessoa eu não defini o @Id, faço isto, pois as classes Aluno e User a PK não pode ser a mesma, uma trabalha sem autoincrement e a outra com autoincrement.
O erro aconteçe na hora em que eu vou gerar a base de dados, usando o SchemaExport, vejam:
Classe Pessoa.java
/**
*
*/
package br.com.sistema.model;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
/**
* Classe abstrata que representa individuos do sistema
* @author Paulo Henrique Peres
*/
@Entity(access=AccessType.FIELD)
@Table(name="Pessoa")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE,
discriminatorValue="Pessoa")
public abstract class Pessoa {
/**
* Nome da Pessoa
*/
@Column(name="nome", nullable=false, length=50)
private String nome;
/**
* E-mail da Pessoa
*/
@Column(name="email", nullable=true, length=40)
private String email;
/**
* Seta o nome do pessoa
* @param nome
*/
public void setNome( String nome ){
this.nome = nome;
}
/**
* Recupera o nome da pessoa
* @return
*/
public String getNome( ){
return this.nome;
}
/**
* Seta o e-mail da pessoa
* @param email
*/
public void setEmail( String email ){
this.email = email;
}
/**
* Recupera o e-mail da pessoa
* @return
*/
public String getEmail ( ){
return this.email;
}
}
Classe Aluno.java
/**
*
*/
package br.com.sistema.model;
import java.util.Set;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* Classe que representa um aluno no sistema
* @author Paulo Henrique Peres
*/
@Entity(access=AccessType.FIELD)
@Table(name="Aluno")
@Inheritance(discriminatorValue="PPessoa")
public class Aluno extends Pessoa {
/**
* Matrícula acadêmica do Aluno
*/
@Id()
private int matricula;
/**
* Curso de graduação do Aluno
*/
@Column(name="curso", nullable=false, length=100)
private String curso;
/**
* Seta a matrícula acadêmica do aluno
* @param matricula
*/
public void setMatricula ( int matricula ){
this.matricula = matricula;
}
@OneToMany(mappedBy="Aluno")
private Set<Frequencia> frequencias;
/**
* Recupera a matrícula acadêmica do aluno
* @return
*/
public int getMatricula ( ){
return this.matricula;
}
/**
* Seta o curso do aluno
* @param curso
*/
public void setCurso ( String curso ){
this.curso = curso;
}
/**
* Recupera o curso do aluno
* @return
*/
public String getCurso ( ){
return this.curso;
}
}
Classe User.java
/**
*
*/
package br.com.sistema.model;
import javax.persistence.AccessType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
/**
* Classe que representa um usuário do sistema
* @author Paulo Henrique Peres
*
*/
@Entity(access=AccessType.FIELD)
@Table(name="User")
@SequenceGenerator(name="SEQ_USER", sequenceName="SEQ_USER")
@Inheritance(discriminatorValue="PPessoa")
public class User extends Pessoa {
/**
* Id do Usuário
*/
@Id(generate=GeneratorType.SEQUENCE, generator="SEQ_USER")
private int id;
/**
* Login de entrada ao sistema
*/
@Column(name="login", nullable=false, length=20)
private String login;
/**
* Senha para entrada no sistema
*/
@Column(name="senha", nullable=false, length=20)
private String senha;
/**
* Seta o id do usuário
* @param id
*/
public void setId ( int id ){
this.id = id;
}
/**
* Recupera o id do usuário
* @return
*/
public int getId ( ){
return this.id;
}
/**
* Seta o login do usuário
* @param login
*/
public void setLogin ( String login ){
this.login = login;
}
/**
* Recupera o login do usuário
* @return
*/
public String getLogin ( ){
return this.login;
}
/**
* Seta a senha do usuário
* @param senha
*/
public void setSenha ( String senha ){
this.senha = senha;
}
/**
* Recupera a senha do usuário
* @return
*/
public String getSenha ( ){
return this.senha;
}
}
E o erro na hora de criar as tabelas:
java.lang.NullPointerException
at org.hibernate.mapping.PersistentClass.createPrimaryKey(PersistentClass.java:283)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:464)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:177)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:999)
at br.com.sistema.hibernate.HibernateUtil.<clinit>(HibernateUtil.java:27)
at br.com.sistema.action.CadastraAluno.<init>(CadastraAluno.java:21)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at com.opensymphony.xwork.ObjectFactory.buildBean(ObjectFactory.java:107)
at com.opensymphony.xwork.ObjectFactory.buildAction(ObjectFactory.java:87)
at com.opensymphony.xwork.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:168)
at com.opensymphony.xwork.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:228)
at com.opensymphony.xwork.config.providers.XmlConfigurationProvider.loadConfigurationFile(XmlConfigurationProvider.java:567)
at com.opensymphony.xwork.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:124)
at com.opensymphony.xwork.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:85)
at com.opensymphony.xwork.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:56)
at com.opensymphony.xwork.DefaultActionProxyFactory.setupConfigIfActionIsCommand(DefaultActionProxyFactory.java:58)
at com.opensymphony.xwork.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:43)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:270)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
11:37:38,359 ERROR SchemaUpdate: could not complete schema update
org.hibernate.AnnotationException: Use of the same entity name twice: Pessoa
at org.hibernate.cfg.annotations.EntityBinder.bindEntity(EntityBinder.java:177)
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:389)
at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:177)
at org.hibernate.cfg.Configuration.generateSchemaUpdateScript(Configuration.java:732)
at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:135)
at br.com.sistema.hibernate.HibernateUtil.generateDataBase(HibernateUtil.java:53)
at br.com.sistema.action.CadastraAluno.execute(CadastraAluno.java:24)
at com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:283)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:166)
at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:116)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.serviceAction(ServletDispatcher.java:272)
at com.opensymphony.webwork.dispatcher.ServletDispatcher.service(ServletDispatcher.java:237)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)
Atenciosamente,
Paulo Henrique Peres