Mapear herança no Hibernate

4 respostas
V

To fazendo meu projeto final da faculdade e to empacado na hora de implementar herança no meu codigo, gostaria de saber se alguem pode me dar uma luz.

Acontece o seguinte tenho uma classe Pessoa com os dados que são comuns a funcionario e cliente e estou tentando usar a estrategia de mapeamento do hibernate a TABLE-PER-SUBCLASSES só que a duvida é onde eu faço o mapeamento, pois eu mapeei tudo na classe Pessoa, pois, por analogia tendo em vista a tag
Funcionario e cliente extendem de Pessoa

4 Respostas

Jair_Rillo_Junior

Vitor,
Poste o código do seu mapeamento e descreva exatamente (com a exception) o problema que está acontecendo. Assim fica mais fácil para o pessoal te ajudar

V

Oque ta acontecendo é o seguinte do jeito que esta, o hibernate ta dizendo que não ta encontrando mapeamento para Funcionario, ai se eu faço o mapeamento para funcionario ele diz que tem mapeamento duplicado para o mesmo …

Agradeço a ajuda.

TelaFuncionario.jsp

<s:form action="MantemFuncionario" method="POST" theme="simple">
<table bgcolor="gold" align="center">	
<tr>
	<td>
		Nome
	</td>
	<td>
		<s:textfield name="f.nome" />
	</td>
</tr>
<tr>
	<td>
		Telefone
	</td>
	<td>
		<s:textfield name="f.telefone"  />
	</td>
</tr>
<tr>
	<td>
		Celular
	</td>
	<td>		
		<s:textfield name="f.celular" />
	</td>
</tr>
<tr>
	<td>
		E-mail
	</td>
	<td>		
		<s:textfield name="f.email" />
	</td>
</tr>
<tr>
	<td>
		Endereço
	</td>
	<td>		
		<s:textfield name="f.endereco" />
	</td>	
</tr>
<tr>
	<td>
		Cargo
	</td>
	<td>
		
			<s:select name="f.cargo.nome"
					  headerKey="1"
					  headerValue="--Selecione o cargo"
					  listKey="nome"
					  listValue="nome"
					  list="#session.cargo"
					  value="%{f.cargo.nome}" />
	</td>
</tr>
<tr>
	<td>
		Area Conhecimento
	</td>
	<td>
		<s:checkboxlist name="f.ac" 
						list="#session.ac"
						listKey="codigo"
						listValue="descricao"
						value="{descricao}"
		/>
	</td>
</tr>
<tr>
	<td>Usuario</td>
	<td><s:textfield name="f.usuario" /> </td>
</tr>
<tr>
	<td>Senha</td>
	<td><s:textfield name="f.senha" /> </td>	
</tr>

<tr>
	<td colspan="2">		
		<s:submit name="comando" value="Cadastrar" />	
		<s:submit name="comando" value="Alterar" />
		<s:submit name="comando" value="Consultar" />
		<s:submit name="comando" value="Excluir" />
		<s:submit name="comando" value="Voltar" />
	</td>
</tr>
</table>

</s:form>

struts.xml

...
<action name="MantemFuncionario" class="action.ActionTelaFuncionario" method="execute">
       <result name="success">/TelaMensagem.jsp</result>
       <result name="input">/TelaFuncionario.jsp</result>
       <result name="error">/TelaErro.jsp</result>
       <result name="voltar">/TelaPrincipal.jsp</result>
                                      ...
</action>

ActionTelaFuncionario.java

public class ActionTelaFuncionario extends ActionSupport{

	private String comando;
	private Funcionario f;
	private List<AreaConhecimento> ac;
	

	@Override
	public String execute() throws Exception {
			
		try {
			DAOFuncionario daof = new DAOFuncionario();
			
			if (comando.equals("Cadastrar")) {
				daof.save(f);
				
			}
			if (comando.equals("Consultar")) {
				f=daof.find(f);
				return ActionSupport.INPUT;
			}
			if (comando.equals("Alterar")) {
				daof.update(f);
				
			}
			if (comando.equals("Excluir")) {
				daof.delete(f);
				
			}
			if (comando.equals("Voltar")) {
				return "voltar";
			}
			
			return ActionSupport.SUCCESS;
			
		} catch (Exception e) {
			e.printStackTrace();
			return ActionSupport.ERROR;
		}
}

DAOFuncionario.java

public class DAOFuncionario {

	private SessionFactory factory;

	public DAOFuncionario() {
		
		factory = new Configuration().addClass(Pessoa.class).addClass(Funcionario.class).addClass(Cargo.class).buildSessionFactory();
	}
	//save, update ...

Pessoa.hbm.xml

<hibernate-mapping package="modelo" default-lazy="true"> 

 <class name="modelo.Pessoa"
         table="pessoa">
     <id name="cod_pessoa"
         type="integer"
         unsaved-value="0">
       <generator class="increment"/>
     </id>

  	<property name="nome" column="nome" type="string" />
  	<property name="endereco" column="endereco" type="string" />
  	<property name="celular" column="celular" type="string" />
  	<property name="telefone" column="telefone" type="string" />
  	<property name="email" column="e-mail" type="string" />

  <joined-subclass name="modelo.Funcionario"
                   table="funcionario">
    <key column="id"/>
   		<property name="matricula" column="matricula" />
		<property name="usuario" column="usuario" />
		<property name="senha" column="senha" />
		<many-to-one name="cargo" class="modelo.Cargo" />
  </joined-subclass>
  </class>
</hibernate-mapping>
paulogami

olá Vitor!!!

posso estar enganado, pois tenho 9 meses de experiencia.

tenta mapear pelo Funcionario, ficando dessa forma “Funcionario.hbm.xml” não precisando do “joined-subclass”, acrescentando as variaveis de pessoa e de funcionario.

no código xml ta errado, pelo codigo você crio uma tabela “Pessoa” no banco, que na verdade tem que criar Funcionario.

no name coloca o endereço inteiro onde fica a classe de modelo “Funcionario”.
na table tem que ser funcionario.

V

Cara agradeço parece que funcionou, só não consegui pois to com problema na combobox que quando dou submit na tela só da um reload na pagina e não envia nada para minha action

Criado 1 de março de 2010
Ultima resposta 2 de mar. de 2010
Respostas 4
Participantes 3