Boa Noite galera,
estou fazendo um sistema com Spring+Hibernate+Anotations, com BD Firebird.
Nesse sistema eu tenho uma Superclasse Concreta usuário, da qual eu tenho uma classe abstrata Funcionario que herda dela.
Por sua Vez, Tenho duas subclasses FuncionarioSindicato e FuncionarioEmpresa que herdam de Funcionario.
Só que acontece um erro de JDBC quando tento salvar um objeto FuncionarioSidicato:
Table unknown
FUNCIONARIOSINDICATO
Esse mapeamento está correto? o que devo fazer???
PS: Não tenho tanta experiência com Hibernate e Annotations, então sintam-se livres para criticar rsrs
CLASSE USUARIO
package sindicalweb.pojo;
import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@Table(name="USUARIO")
@SequenceGenerator(name = "GEN_USUARIO_ID", sequenceName = "GEN_USUARIO_ID", allocationSize=1 )
public class Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "GEN_USUARIO_ID")
@Column(name="CD_USUARIO")
private Long codigo;
(...)
CLASSE FUNCIONARIO
@Entity
@MappedSuperclass
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="DISCRIMINATOR",
discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("FUNCIONARIO")
@PrimaryKeyJoinColumn(name="CD_FUNCIONARIO")
@Table(name="FUNCIONARIO")
public abstract class Funcionario extends Usuario implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name="NR_CPF")
private String CPF;
@Column(name="NR_RG")
private String RG;
(...)
Classe FuncionarioSindicato
@Entity
@DiscriminatorValue("FS")
@Inheritance
public class FuncionarioSindicato extends Funcionario implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name="CD_SINDICATO")
private Sindicato sindicato;
(...)
Voce não citou nada sobre o hibernate.cfg.xml
Voce tem esse arquivo, com tags do tipo <mapping class=“NomeDaClass”/>?
Tenho. Todas as classes estão mapeadas no hibernate.cfg.xml e inclusive TODAS as heranças da Classe Usuario estão funcionando corretamente.
Apenas quando tento salvar um FuncionarioSindicato ou um FUncionarioEmpresa é que aparecem problemas
Cara… complicado hein…
será que você poderia colar todo o stacktrace do erro?
Outra coisa, nao sei se vc usa o log4j, ele traz muitas informaçòes sobre tudo o que acontece durante a execucao da aplicacao referente ao hibernate. Lá tb não ha nenhuma informação util?
Como ficou as tuas tabelas?
Ele indica ali que nao achou a tabela FUNCIONARIOSINDICATO
Estou sem o stacktrace do erro onde estou agora, mas ele dá uma Exception do Firebird:
FBSQLException.
Error Code -201
Table Unknown: FUNCIONARIOSINDICATO
Sobre as tabelas eu tenho uma tabela Usuario e uma tabela Funcionario, sendo que nesta última eu estava querendo mapear as classes FuncionarioSindicato e FuncionarioEmpresa em uma única tabela i.[/i]
Agora se em Funcionario eu coloco @MappedSuperClass ele dá outro erro de SQL dizendo que a coluna Discriminator da Tabela funcionario não pode ter valores nulos
Então fiquei na duvida: Porque as subclasses FuncionarioSindicato e FuncionarioEmpresa não setam o valor do DISCRIMINATOR, já que elas estão mapeadas com @DiscriminatorValue(“XX”)???
[/b]
STACKTRACE COM O @MAPPEDSUPERCLASS
org.hibernate.exception.GenericJDBCException: could not insert: [sindicalweb.pojo.FuncionarioSindicato]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2217)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2610)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:52)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at sindicalweb.teste.SPrincipal.doPost(SPrincipal.java:139)
at sindicalweb.teste.SPrincipal.doGet(SPrincipal.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
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:868)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
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)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544347. validation error for column DISCRIMINATOR, value "*** null ***"
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:503)
at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate(AbstractPreparedStatement.java:144)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2200)
... 28 more
STACKTRACE SEM O @MAPPEDSUPERCLASS
org.hibernate.exception.GenericJDBCException: could not insert: [sindicalweb.pojo.FuncionarioSindicato]
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2267)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2660)
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:52)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at sindicalweb.teste.SPrincipal.doPost(SPrincipal.java:139)
at sindicalweb.teste.SPrincipal.doGet(SPrincipal.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
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:868)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
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)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -204
Table unknown
FUNCIONARIOSINDICATO
At line 1, column 13.
at org.firebirdsql.jdbc.AbstractPreparedStatement.<init>(AbstractPreparedStatement.java:91)
at org.firebirdsql.jdbc.FBPreparedStatement.<init>(FBPreparedStatement.java:34)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:682)
at org.firebirdsql.jdbc.AbstractConnection.prepareStatement(AbstractConnection.java:232)
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:94)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2232)
... 28 more
Cara… infelizmente não tenho a resposta para isso. O que eu posso te dizer é: revire os tutoriais e a documentaçao no site do hibernate, talvez voce ache uma forma alternativa de fazer isso.
Ou entao, visite o proprio forum deles. É meio chato usar ele, faz pode te ajudar e muito.
Este teu banco está vazio?
Nao tem no banco um FuncionarioSindicato que esteja com o valor null para a DiscriminatorValue?
Talvez ele esteja tentando dar um update em alguém, mas quando le do banco, este valor esta nulo.
Tenta fazer esse teste com o banco vazio, ou pelo menos essa tabela vazia!
O BD tá vazio… sem dado nenhum.
Pelo que eu percebi ele tenta colocar algum registro na tabela funcionario, mas ele não entende o mapeamento feito na CLASSE Funcionario, co o valor do Discriminator.
Como ele não entende o mapeamento, não seta o Discriminator. Como o campo do Discriminator é NOT NULL, dá erro de JDBC.
Cara, estou com o mesmo problema que o seu…
O que pude perceber é que no seu código as anotações @Inheritance e @DiscriminatorColumn estão na classe descendente… pela documentação, elas devem estar na classe-base, no caso na classe Usuário.
Outro detalhe é que você está ‘tentando’ alterar a estratégia de herança na classe descendente, acredito que não seja permitido.
A minha aplicação está aparentemente ok, mas também não tem o valor da coluna definida para armazenar o valor de diferenciação (discriminator value) atribuído. Consequentemente, ao gravar o registro no banco, BANG! Any help!?