Problema Estratégia Herança Hibernate Annotations

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 :smiley: 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

Ninguém para ajudar?

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&#58; could not insert&#58; &#91;sindicalweb.pojo.FuncionarioSindicato&#93;
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException&#40;SQLStateConverter.java&#58;103&#41;
	at org.hibernate.exception.SQLStateConverter.convert&#40;SQLStateConverter.java&#58;91&#41;
	at org.hibernate.exception.JDBCExceptionHelper.convert&#40;JDBCExceptionHelper.java&#58;43&#41;
	at org.hibernate.persister.entity.AbstractEntityPersister.insert&#40;AbstractEntityPersister.java&#58;2217&#41;
	at org.hibernate.persister.entity.AbstractEntityPersister.insert&#40;AbstractEntityPersister.java&#58;2610&#41;
	at org.hibernate.action.EntityInsertAction.execute&#40;EntityInsertAction.java&#58;52&#41;
	at org.hibernate.engine.ActionQueue.execute&#40;ActionQueue.java&#58;248&#41;
	at org.hibernate.engine.ActionQueue.executeActions&#40;ActionQueue.java&#58;232&#41;
	at org.hibernate.engine.ActionQueue.executeActions&#40;ActionQueue.java&#58;139&#41;
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions&#40;AbstractFlushingEventListener.java&#58;298&#41;
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush&#40;DefaultFlushEventListener.java&#58;27&#41;
	at org.hibernate.impl.SessionImpl.flush&#40;SessionImpl.java&#58;1000&#41;
	at org.hibernate.impl.SessionImpl.managedFlush&#40;SessionImpl.java&#58;338&#41;
	at org.hibernate.transaction.JDBCTransaction.commit&#40;JDBCTransaction.java&#58;106&#41;
	at sindicalweb.teste.SPrincipal.doPost&#40;SPrincipal.java&#58;139&#41;
	at sindicalweb.teste.SPrincipal.doGet&#40;SPrincipal.java&#58;25&#41;
	at javax.servlet.http.HttpServlet.service&#40;HttpServlet.java&#58;743&#41;
	at javax.servlet.http.HttpServlet.service&#40;HttpServlet.java&#58;856&#41;
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter&#40;ApplicationFilterChain.java&#58;252&#41;
	at org.apache.catalina.core.ApplicationFilterChain.doFilter&#40;ApplicationFilterChain.java&#58;173&#41;
	at org.apache.catalina.core.StandardWrapperValve.invoke&#40;StandardWrapperValve.java&#58;213&#41;
	at org.apache.catalina.core.StandardContextValve.invoke&#40;StandardContextValve.java&#58;178&#41;
	at org.apache.catalina.core.StandardHostValve.invoke&#40;StandardHostValve.java&#58;126&#41;
	at org.apache.catalina.valves.ErrorReportValve.invoke&#40;ErrorReportValve.java&#58;105&#41;
	at org.apache.catalina.core.StandardEngineValve.invoke&#40;StandardEngineValve.java&#58;107&#41;
	at org.apache.catalina.connector.CoyoteAdapter.service&#40;CoyoteAdapter.java&#58;148&#41;
	at org.apache.coyote.http11.Http11Processor.process&#40;Http11Processor.java&#58;868&#41;
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection&#40;Http11BaseProtocol.java&#58;663&#41;
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket&#40;PoolTcpEndpoint.java&#58;527&#41;
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt&#40;LeaderFollowerWorkerThread.java&#58;80&#41;
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run&#40;ThreadPool.java&#58;684&#41;
	at java.lang.Thread.run&#40;Unknown Source&#41;
Caused by&#58; org.firebirdsql.jdbc.FBSQLException&#58; GDS Exception. 335544347. validation error for column DISCRIMINATOR, value &quot;*** null ***&quot;
	at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute&#40;AbstractPreparedStatement.java&#58;503&#41;
	at org.firebirdsql.jdbc.AbstractPreparedStatement.executeUpdate&#40;AbstractPreparedStatement.java&#58;144&#41;
	at org.hibernate.persister.entity.AbstractEntityPersister.insert&#40;AbstractEntityPersister.java&#58;2200&#41;
	... 28 more

STACKTRACE SEM O @MAPPEDSUPERCLASS

org.hibernate.exception.GenericJDBCException&#58; could not insert&#58; &#91;sindicalweb.pojo.FuncionarioSindicato&#93;
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException&#40;SQLStateConverter.java&#58;103&#41;
	at org.hibernate.exception.SQLStateConverter.convert&#40;SQLStateConverter.java&#58;91&#41;
	at org.hibernate.exception.JDBCExceptionHelper.convert&#40;JDBCExceptionHelper.java&#58;43&#41;
	at org.hibernate.persister.entity.AbstractEntityPersister.insert&#40;AbstractEntityPersister.java&#58;2267&#41;
	at org.hibernate.persister.entity.AbstractEntityPersister.insert&#40;AbstractEntityPersister.java&#58;2660&#41;
	at org.hibernate.action.EntityInsertAction.execute&#40;EntityInsertAction.java&#58;52&#41;
	at org.hibernate.engine.ActionQueue.execute&#40;ActionQueue.java&#58;248&#41;
	at org.hibernate.engine.ActionQueue.executeActions&#40;ActionQueue.java&#58;232&#41;
	at org.hibernate.engine.ActionQueue.executeActions&#40;ActionQueue.java&#58;139&#41;
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions&#40;AbstractFlushingEventListener.java&#58;298&#41;
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush&#40;DefaultFlushEventListener.java&#58;27&#41;
	at org.hibernate.impl.SessionImpl.flush&#40;SessionImpl.java&#58;1000&#41;
	at org.hibernate.impl.SessionImpl.managedFlush&#40;SessionImpl.java&#58;338&#41;
	at org.hibernate.transaction.JDBCTransaction.commit&#40;JDBCTransaction.java&#58;106&#41;
	at sindicalweb.teste.SPrincipal.doPost&#40;SPrincipal.java&#58;139&#41;
	at sindicalweb.teste.SPrincipal.doGet&#40;SPrincipal.java&#58;25&#41;
	at javax.servlet.http.HttpServlet.service&#40;HttpServlet.java&#58;689&#41;
	at javax.servlet.http.HttpServlet.service&#40;HttpServlet.java&#58;802&#41;
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter&#40;ApplicationFilterChain.java&#58;252&#41;
	at org.apache.catalina.core.ApplicationFilterChain.doFilter&#40;ApplicationFilterChain.java&#58;173&#41;
	at org.apache.catalina.core.StandardWrapperValve.invoke&#40;StandardWrapperValve.java&#58;213&#41;
	at org.apache.catalina.core.StandardContextValve.invoke&#40;StandardContextValve.java&#58;178&#41;
	at org.apache.catalina.core.StandardHostValve.invoke&#40;StandardHostValve.java&#58;126&#41;
	at org.apache.catalina.valves.ErrorReportValve.invoke&#40;ErrorReportValve.java&#58;105&#41;
	at org.apache.catalina.core.StandardEngineValve.invoke&#40;StandardEngineValve.java&#58;107&#41;
	at org.apache.catalina.connector.CoyoteAdapter.service&#40;CoyoteAdapter.java&#58;148&#41;
	at org.apache.coyote.http11.Http11Processor.process&#40;Http11Processor.java&#58;868&#41;
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection&#40;Http11BaseProtocol.java&#58;663&#41;
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket&#40;PoolTcpEndpoint.java&#58;527&#41;
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt&#40;LeaderFollowerWorkerThread.java&#58;80&#41;
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run&#40;ThreadPool.java&#58;684&#41;
	at java.lang.Thread.run&#40;Unknown Source&#41;
Caused by&#58; org.firebirdsql.jdbc.FBSQLException&#58; GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -204
Table unknown
FUNCIONARIOSINDICATO
At line 1, column 13.
	at org.firebirdsql.jdbc.AbstractPreparedStatement.&lt;init&gt;&#40;AbstractPreparedStatement.java&#58;91&#41;
	at org.firebirdsql.jdbc.FBPreparedStatement.&lt;init&gt;&#40;FBPreparedStatement.java&#58;34&#41;
	at org.firebirdsql.jdbc.AbstractConnection.prepareStatement&#40;AbstractConnection.java&#58;682&#41;
	at org.firebirdsql.jdbc.AbstractConnection.prepareStatement&#40;AbstractConnection.java&#58;232&#41;
	at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement&#40;AbstractBatcher.java&#58;505&#41;
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement&#40;AbstractBatcher.java&#58;94&#41;
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement&#40;AbstractBatcher.java&#58;87&#41;
	at org.hibernate.persister.entity.AbstractEntityPersister.insert&#40;AbstractEntityPersister.java&#58;2232&#41;
	... 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!?