Problema Mapeamento Herança Hibernate Annotations

4 respostas
Misterious

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;
(...)

4 Respostas

Misterious

Ninguém para ajudar?

plentz

Bom, você não mapeou tableName na classe FuncionarioSindicato, e o Hibernate imagina então que o nome da sua tabela é o mesmo da classe, logo, você precisaria de uma tabela chamada “FUNCIONARIOSINDICATO” que é o erro que ele está acusando.

Comentário não relacionado à pergunta: essa sua estrutura de herança com hibernate provavelmente (pra não dizer com certeza) vai te gerar uma dor de cabeça do cão.

Misterious

Certo Plentz, entendi essa parte, mas o que eu queria era fazer essa mistura de estratégias:

Usuario para as demais classes eu fazer Tabela por SubClasse
e de Funcionario para FuncionarioSindicato/FuncionarioEmpresa fazer Tabela por Hierarquia de Classes

A dúvida que ficou pra mim é: É possivel fazer essa misturas de estratégias? Se sim, pelo que vc falou não iria compensar. O que seria melhor então, já que seria interessante pra minha aplicação existir essa superclasse Funcionario?

plentz

Não parei para olhar se tem como misturar as estratégias, mas também não consegui ver no que você poderia tirar proveito nisso.

Sobre a decisão de qual estratégia tomar, não tem como simplesmente “chutar” uma decisão, você deve tomar analisando quais são as espectativas de crescimento da aplicação, tipos de consultas que irão rodar nelas, etc.

Criado 18 de abril de 2007
Ultima resposta 10 de jun. de 2007
Respostas 4
Participantes 2