Problema com relacionamento + Anotations

2 respostas
derheimen
Pessoal estou com um problema em mapear tabelas de Banco de Dados e já estou ficando louco pois ainda não resolvi. Error:
ERROR [main] (StandardContext.java:3953) - Servlet /portalSolicitacao threw load() exception org.hibernate.AnnotationException: @OneToOne or @ManyToOne on br.com.unic.solicitacao.model.vo.UsuarioVO.empresaVO references an unknown entity: br.com.uni c.solicitacao.model.vo.EmpresaVO at org.hibernate.cfg.FkSecondPass.doSecondPass(FkSecondPass.java:56) at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:428) at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:286) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1210) ...
TABELA DE LOGIN ( SSPTB01_LOGIN )
codg_usuario, number, 
nome_completo, varchar2(50), 
cpf, varchar2(15), 
login, varchar2(20), 
senha, varchar2(50), 
conf_senha, varchar2(50), 
num_tentativa, varchar2(2), 
flag_status, varchar2(2), 
situacao, varchar2(2), 
codg_permissao, number, 
codg_empresa, number, 
codg_filial, number, 
codg_cc, varchar2(15)
TABELA DE EMPRESA ( SSPTB03_EMPRESA )
codg_empresa, number, 
sigla_empresa, varchar2(10), 
desc_empresa, varchar2(35)
CLASSE [color=blue]UsuarioVO[/color]
@Entity
@Table(name="ssptb01_login")
@SequenceGenerator( name="codg_gen_login",  sequenceName="seq_ssptb01_login",  allocationSize=1)
public class UsuarioVO {
	@Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="codg_gen_login")
    @Column(name="codg_usuario", unique = true)
    private Integer codgUsuario;

	... CAMPOS OMITIDOS

	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="codg_empresa")
    private EmpresaVO empresaVO;

	@OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="codg_cc")
    private CentroCustoVO centroCustoVO;

	public final CentroCustoVO getCentroCustoVO() {
		return centroCustoVO;
	}
	public final void setCentroCustoVO(CentroCustoVO centroCustoVO) {
		this.centroCustoVO = centroCustoVO;
	}

	public final EmpresaVO getEmpresaVO() {
		return empresaVO;
	}
	public final void setEmpresaVO(EmpresaVO empresaVO) {
		this.empresaVO = empresaVO;
	}

	... MÉTODOS OMITIDOS
}
CLASSE [color=blue]EmpresaVO[/color]
@Entity
@Table(name="ssptb03_empresa")
public class EmpresaVO {
	@Id
	@Column (name="codg_empresa")
	private Integer codgEmpresa;

	@Column (name="sigla_empresa")
	private String siglaEmpresa;
	
	@Column (name="desc_empresa")
	private String descEmpresa;

	... MÉTODOS ACESSORES
}
No mapeamento de EmpresaVO na classe UsuarioVO, se eu utilizar [color=red]OneToOne[/color] ou [color=red]ManyToOne[/color], sempre lança essa execption, não entendo porque não funciona, pois tenho um tabela na base de dados de Centro de Custos do mesmo estilo da empresa e funciona perfeitamente. TABELA DE CENTRO DE CUSTOS ( SSPTB05_CENTRO_CUSTO )
codg_cc, varchar2(15), 
desc_cc, varchar2(40), 
campus_cc, varchar2(3)
A classe CentroCustoVO que representa esta tabela, esta mapeada em UsuarioVO, não lança nenhum tipo de exception para esse relacionamento e esta funcionando pois já testei.

Alguém poderia me ajudar?

2 Respostas

M

Poh Heider. O Hibernate (ainda) não identifica suas classes persistentes apenas anotando-as… Coloque sua classe br.com.uni
c.solicitacao.model.vo.EmpresaVO
no seu arquivo de configuração…

[]'s

derheimen

Puts Jean, não acredito que esqueci de adicionar a minha classe mapeada EmpresaVO na minha classe de configuração.

Eu disse classe de configuração pois estou utilizando o MENTAWAI, que trabalha como configuração programatica.

Minha classe de configuração:
package br.com.unic;

import java.io.IOException;
import java.util.Locale;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.mentawai.core.Context;
import org.mentawai.core.StreamConsequence;
import org.mentawai.db.C3P0ConnectionHandler;
import org.mentawai.db.ConnectionHandler;
import org.mentawai.filter.ConnectionFilter;
import org.mentawai.filter.DIFilter;
import org.mentawai.filter.HibernateFilter;
import org.mentawai.filter.InjectionFilter;
import org.mentawai.filter.IoCFilter;
import org.mentawai.filter.OVFilter;
import org.mentawai.filter.OutputFilter;
import org.mentawai.filter.VOFilter;
import org.mentawai.filter.ValidatorFilter;
import org.mentawai.i18n.LocaleManager;
import org.mentawai.list.BaseListData;
import org.mentawai.list.ListData;
import org.mentawai.list.ListManager;
import org.mentawai.transaction.HibernateTransaction;
import org.mentawai.transaction.JdbcTransaction;

import br.com.unic.solicitacao.controler.action.ProdutoAction;
import br.com.unic.solicitacao.controler.action.SolicitacaoAlmoxarifadoAction;
import br.com.unic.solicitacao.controler.action.UsuarioAction;
import br.com.unic.solicitacao.controler.action.marcador.ConsequencesEnum;
import br.com.unic.solicitacao.controler.service.implementation.ProdutoServiceImpl;
import br.com.unic.solicitacao.controler.service.implementation.SolicitacaoAlmoxarifadoServiceImpl;
import br.com.unic.solicitacao.controler.service.implementation.UsuarioServiceImpl;
import br.com.unic.solicitacao.model.dao.implementation.ProdutoDAOImpl;
import br.com.unic.solicitacao.model.dao.implementation.SolicitacaoDAOImpl;
import br.com.unic.solicitacao.model.dao.implementation.UsuarioDAOImpl;
import br.com.unic.solicitacao.model.vo.CentroCustoVO;
import br.com.unic.solicitacao.model.vo.EmpresaVO;
import br.com.unic.solicitacao.model.vo.FilialVO;
import br.com.unic.solicitacao.model.vo.ProdutoSaldoVO;
import br.com.unic.solicitacao.model.vo.ProdutoVO;
import br.com.unic.solicitacao.model.vo.SolicitacaoVO;
import br.com.unic.solicitacao.model.vo.UsuarioVO;

import org.mentawai.ajax.renderer.JSONGenericRenderer;

public class ApplicationManager extends org.mentawai.core.ApplicationManager
{
	private SessionFactory sessionFactory;

	/** Creates a new instance of ApplicationManager */
    public ApplicationManager() {
    }

	/**
	 * Método init()
	 */
	public void init(Context context)
	{
		// Cria uma sessionFactory para passar para o hibernateFilter.
		sessionFactory = new AnnotationConfiguration()
        	.addAnnotatedClass(ProdutoVO.class)
        	.addAnnotatedClass(ProdutoSaldoVO.class)
        	.addAnnotatedClass(SolicitacaoVO.class)
        	.addAnnotatedClass(UsuarioVO.class)
        	.addAnnotatedClass(EmpresaVO.class)
        	.addAnnotatedClass(FilialVO.class)
        	.addAnnotatedClass(CentroCustoVO.class)
        	.configure()
        	.buildSessionFactory();

		// IoC components (SERVICEs)
		// IoC para criar as instancias das classes concretas que será injetada nas actions.
		ioc("solicitacaoService", SolicitacaoAlmoxarifadoServiceImpl.class);
		ioc("produtoService", ProdutoServiceImpl.class);
		ioc("usuarioService", UsuarioServiceImpl.class);

		// IoC components (DAOs)
		// IoC para criar as instancias das classes concretas que será injetada nos DAOs.
		ioc("solicitacaoDAO", SolicitacaoDAOImpl.class);
		ioc("produtoDAO", ProdutoDAOImpl.class);
		ioc("usuarioDAO", UsuarioDAOImpl.class);

		// HIBERNATE
		ioc("transaction", HibernateTransaction.class);
	}

	/**
	 * Método loadLists() 
	 * Para carregar as SimpleListData, dos combobox utilizaddos nas páginas
	 */
	public void loadLists() throws IOException
	{
		// Altera a ordem da lista de dados por ID ao invés de por valor, que é o padrão
		ListData consultas = new BaseListData("consultas", BaseListData.ORDER_BY_ID);
		ListManager.addList(consultas);

		ListData consultasSolicitacao = new BaseListData("consultasSolicitacao", BaseListData.ORDER_BY_ID);
		ListManager.addList(consultasSolicitacao);

		ListData consultasTipoSolicitacao = new BaseListData("consultasTipoSolicitacao", BaseListData.ORDER_BY_ID);
		ListManager.addList(consultasTipoSolicitacao);
	}

	/**
	 * Método loadActions()
	 * Para realizar as configurações das actions da aplicação
	 */
	public void loadActions()
	{
		// FILTRO IoC que ira instanciar as classes indicadas acima atribuindo as chaves passasdas.
		addGlobalFilter(new IoCFilter());

		// FILTRO que tentara injetar as instancias criadas pelo IoC dentro de nossas action sem a necessidade de um método set
		addGlobalFilter(new InjectionFilter()); // Novo

		// Passa a sessionFactory pronta para o HibernateFilter.
        addGlobalFilter(new HibernateFilter(sessionFactory));

        // FILTRO que satisfará qualquer dependencia configurada. - Novo
        addGlobalFilter(new DIFilter());

        // DI que injetara uma session para quem precisar.
        di("session", Session.class); // Novo

        // DI que injetara a implementação das classes concretas de persitência de dados
        di("solicitacaoDAO", SolicitacaoDAOImpl.class);
        di("produtoDAO", ProdutoDAOImpl.class);
        di("usuarioDAO", UsuarioDAOImpl.class);

        // FILTRO que tentara injetar as instancias criadas pelo IoC dentro de nossas action sem a necessidade de um método set
        addGlobalFilter(new OutputFilter());

        // Filtro para a validação
        filter(new ValidatorFilter());

        // ProutoAction
        action("/produtoAction", ProdutoAction.class)
        	.on(ERROR, fwd("/index.jsp"))
        	.ajaxOk(new JSONGenericRenderer())
        	.on(ConsequencesEnum.CONSULTAR.getConsequence(), fwd("/index.jsp"))
        	.on(ConsequencesEnum.REFRESH_FORM.getConsequence(), fwd("/index.jsp"))
			.filter(new VOFilter(ProdutoVO.class, "produtoVO"))
			.filter(new OVFilter("produtoVO"));

        // UsuarioAction
		action("/usuarioAction", UsuarioAction.class)
			.on(SUCCESS, fwd("/index.jsp"))
			.on(ERROR, fwd("/index.jsp"))
			.ajaxOk(new JSONGenericRenderer())
			.on(ConsequencesEnum.INCLUIR.getConsequence(), fwd("/index.jsp"))
			.filter(new VOFilter(CentroCustoVO.class, "centroCustoVO"))
			.filter(new VOFilter(UsuarioVO.class, "usuarioVO"))
			.filter(new OVFilter("usuarioVO"));

        // SolicitacaoAlmoxarifadoAction - Gera Relatórios de solicitações
         action("/solicitacaoAction", SolicitacaoAlmoxarifadoAction.class)
         	.on(SUCCESS, new StreamConsequence("application/pdf")) //exibe o relatório na tela
         	.on(ERROR, fwd("/error_ssp.jsp")) //resposta de erro caso aconteça alguma cagada
         	.on(ConsequencesEnum.CONSULTAR.getConsequence(), fwd("/index.jsp"))
         	.addFilter(new InjectionFilter());
	}

	/**
	 * Método para internacionalização.
	 */
	public void loadLocales()
	{
		LocaleManager.add(new Locale("pt", "BR"));
        LocaleManager.add(new Locale("en", "US"));
    }
}
Segue como ficou o meu mapeamento, pois estava fazendo errado tb:
package br.com.unic.solicitacao.model.vo;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="ssptb03_empresa")
public class EmpresaVO
{
	@Id
	@Column (name="codg_empresa")
	private Integer codgEmpresa;

	@Column (name="sigla_empresa")
	private String siglaEmpresa;

	@Column (name="desc_empresa")
	private String descEmpresa;

	@OneToMany(mappedBy="empresaVO")
	private Set<FilialVO> filiais;

	@OneToMany(mappedBy = "empresaVO")
	private Set<UsuarioVO> usuarios;

	public final Integer getCodgEmpresa() {
		return codgEmpresa;
	}
	public final void setCodgEmpresa(Integer codgEmpresa) {
		this.codgEmpresa = codgEmpresa;
	}

	public final String getSiglaEmpresa() {
		return siglaEmpresa;
	}
	public final void setSiglaEmpresa(String siglaEmpresa) {
		this.siglaEmpresa = siglaEmpresa;
	}

	public final String getDescEmpresa() {
		return descEmpresa;
	}
	public final void setDescEmpresa(String descEmpresa) {
		this.descEmpresa = descEmpresa;
	}

	public final Set<UsuarioVO> getUsuarios() {
		return usuarios;
	}
	public final void setUsuarios(Set<UsuarioVO> usuarios) {
		this.usuarios = usuarios;
	}

	public final Set<FilialVO> getFiliais() {
		return filiais;
	}
	public final void setFiliais(Set<FilialVO> filiais) {
		this.filiais = filiais;
	}
}
package br.com.unic.solicitacao.model.vo;

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.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

@Entity
@Table(name="ssptb01_login")
@SequenceGenerator(
		name="codg_gen_login", 
		sequenceName="seq_ssptb01_login", 
		allocationSize=1)
public class UsuarioVO extends BaseObject
{
	private static final long serialVersionUID = 1L;

	@Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="codg_gen_login")
    @Column(name="codg_usuario", unique = true)
    private Integer codgUsuario;

	@Column (name="nome_completo")
	private String nomeCompl;

	@Column (name="cpf")
	private String cpf;

	@Column (name="login")
	private String login;

	@Column (name="senha")
	private String senha;

	@Column (name="conf_senha")
	private String confSenha;

	@Column (name="num_tentativa")
	private String numTentativa;

	@Column (name="flag_status")
	private String flagStatus;

	@Column (name="situacao")
	private String situacao;

	@Column (name="codg_permissao")
	private String codgPermissao;

	@ManyToOne
	@JoinColumn(name = "codg_empresa", nullable = false)
	private EmpresaVO empresaVO;

	@OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="codg_cc")
    private CentroCustoVO centroCustoVO;

	/********************* 
	 * Métodos acessores *
	 ******************* */
	public final CentroCustoVO getCentroCustoVO() {
		return centroCustoVO;
	}
	public final void setCentroCustoVO(CentroCustoVO centroCustoVO) {
		this.centroCustoVO = centroCustoVO;
	}

	public final String getCodgPermissao() {
		return codgPermissao;
	}
	public final void setCodgPermissao(String codgPermissao) {
		this.codgPermissao = codgPermissao;
	}
	
	public final Integer getCodgUsuario() {
		return codgUsuario;
	}
	public final void setCodgUsuario(Integer codgUsuario) {
		this.codgUsuario = codgUsuario;
	}
	
	public final String getConfSenha() {
		return confSenha;
	}
	public final void setConfSenha(String confSenha) {
		this.confSenha = confSenha;
	}
	
	public final String getCpf() {
		return cpf;
	}
	public final void setCpf(String cpf) {
		this.cpf = cpf;
	}
	
	public final String getFlagStatus() {
		return flagStatus;
	}
	public final void setFlagStatus(String flagStatus) {
		this.flagStatus = flagStatus;
	}
	
	public final String getLogin() {
		return login;
	}
	public final void setLogin(String login) {
		this.login = login;
	}
	
	public final String getNomeCompl() {
		return nomeCompl;
	}
	public final void setNomeCompl(String nomeCompl) {
		this.nomeCompl = nomeCompl;
	}
	
	public final String getNumTentativa() {
		return numTentativa;
	}
	public final void setNumTentativa(String numTentativa) {
		this.numTentativa = numTentativa;
	}
	
	public final String getSenha() {
		return senha;
	}
	public final void setSenha(String senha) {
		this.senha = senha;
	}
	
	public final String getSituacao() {
		return situacao;
	}
	public final void setSituacao(String situacao) {
		this.situacao = situacao;
	}
	
	/**
	 * Indica se um objeto é igual a outro.
	 *
	 * @param object Objeto a ser comparado.
	 * @return true se forem iguais, false caso contrário.
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	public boolean equals(Object obj) {
		if(obj instanceof UsuarioVO) {
			UsuarioVO usuarioBean = (UsuarioVO) obj;
			if(usuarioBean.getCodgUsuario() == this.getCodgUsuario()) {
				return true;
			}
			return false;
		}
		return false;
	}

	/**
	 * Retorna o Hash Code para o objeto.
	 *
	 * @return Hash Code para o objeto.
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode () {
		return (this.getCodgUsuario() != null ? this.getCodgUsuario().hashCode() : 0);
	}

	/**
	 * Retorna a representação em String do objeto.
	 *
	 * @return Representação em String do objeto.
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		return this.getNomeCompl();
	}
	public final EmpresaVO getEmpresaVO() {
		return empresaVO;
	}
	public final void setEmpresaVO(EmpresaVO empresaVO) {
		this.empresaVO = empresaVO;
	}
}
Valeu pela help.
Criado 29 de novembro de 2007
Ultima resposta 29 de nov. de 2007
Respostas 2
Participantes 2