Não consigo mapear 3 tabelas em bean com hibernate[RESOLVIDO]

9 respostas
janjan

Ola pessoal…
é o seguinte…

quero fazer um controle de acesso aos menus do meu sistema, onde todos menus estarão gravados na base de dados…
então…

o controle de permissao é o seguinte…

tenho as tabelas menus, perfil e menuPerfil

onde a relação esta
na menuperfil pra perfil e na menuperfil pra menus…

os usuarios que são daquele perfil e tem menus cadastrados na menuperfil enchergão os menus…
senão nao verão nada…

em anexo esta o pequeno esquema das tabelas.

agora a organização das minhas classes…

Menuperfil

@Entity
@Table(name = "MenuPefil")
public class MenuPerfil implements Serializable {

	/**
	 * 
	 */

	@Id
	@GeneratedValue
	Long surMenuPerfil;

	@OneToOne
	@JoinColumn(name = "surMenu menus", referencedColumnName = "surMenu")
	private Menus menus;

	@OneToOne
	@JoinColumn(name = "surPerfil perfil", referencedColumnName = "surPerfil")
	Perfil perfil;

getters e setters

}

menus

public class Menus implements Serializable {

	/**
	 * 
	 */

	@Id
	@GeneratedValue
	private Long surMenu;

	private String url;

	private String descricao;

}



perfil

@Entity
@Table(name = "perfil" )
public class Perfil implements Serializable {


	@Id
	@GeneratedValue
	private Long surPerfil;

	private String desPerfil;
	
	
	private Long surPerfilPai;
}

oque tem de errado a galera
o erro é o seguinte

Exception in thread main org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.sentinela.model.MenuPerfil.menus references an unknown entity: com.sentinela.model.Menus

at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:81)

at org.hibernate.cfg.AnnotationConfiguration.processEndOfQueue(AnnotationConfiguration.java:456)

at org.hibernate.cfg.AnnotationConfiguration.processFkSecondPassInOrder(AnnotationConfiguration.java:438)

at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:309)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333)

at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)

venho a alguns dias tentando fazer esse bendito mapeamento, e não estou obtendo sucesso…
já procurei bastante no tio google… tem varias soluções… mas tento elas e nao funciona…


9 Respostas

faelbsr

Você precisa mapear suas tabelas no seu HbernateUtil…

private HibernateUtil() {
        try {
            //sessionFactory = new Configuration().configure("com/i9/webpedidos/entity/hibernate.cfg.xml").buildSessionFactory();            
            sessionFactory = new AnnotationConfiguration().setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect").
                    setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver").
                    setProperty("hibernate.connection.url", "jdbc:mysql://ip_banco:porta_banco/baco_dados").
                    setProperty("hibernate.connection.username", "usuario").
                    setProperty("hibernate.connection.password", "senha").
                    setProperty("hibernate.show_sql", "true").
                    setProperty("hibernate.format_sql", "true")                    
                    .addAnnotatedClass(MenuPerfil.class)
                    .addAnnotatedClass(Perfil.class)
                    .addAnnotatedClass(Menus.class)
                    .buildSessionFactory();

        } catch (HibernateException ex) {
            System.err.print("ERRO HIBERNATE ----------------------------------------" + ex.getMessage());
            ex.printStackTrace();
        }//end catch
janjan

so esqueci de comentar isso
mas meu factory esta asssim

até por que já tenho a classe usuarios funcionando em conjunto com minha perfil e funciona tranquilo…

mas o mapeamento das 2 nova classes ferram tudo!

AnnotationConfiguration configuration = new AnnotationConfiguration();
		configuration.setProperty("hibernate.connection.username", "login");
		configuration.setProperty("hibernate.connection.password", "senha");
		configuration.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost:5432/banco");
		configuration.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
		configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
		
		configuration.setProperty("show_sql", "true");
		configuration.setProperty("format_sql", "true");
		
		configuration.setProperty("hibernate.generate_statistics","true");
		configuration.setProperty("hibernate.use_sql_comments","true");
		configuration.addPackage("com.sentinela.model");

		configuration.addAnnotatedClass(Usuario.class);
		configuration.addAnnotatedClass(Perfil.class);
		configuration.addAnnotatedClass(Erro.class);
		configuration.addAnnotatedClass(Menus.class);
		configuration.addAnnotatedClass(MenuPerfil.class);
		
		
		
		factory = configuration.buildSessionFactory();
faelbsr

Acho que sei qual é o problema… O relacionamento entre entidades é uma mão de duas vias… onde você colocar OneToMany de um lado tem que ter ManyToOne do outro…

Ou seja eu vi que você só colocou anotação OneToMany no seu modelo Menu e não colocou o ManyToOne nos outros modelos…

faelbsr

Vai ai um exemplo para você ver

@Entity
@Table(name = "pessoa_administrador")
public class PessoaAdministrador implements java.io.Serializable {

   //...
    
    @ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name="empresa")
    private PessoaEmpresa pessoaEmpresa;
    
    //...
}


@Entity
@Table(name = "pessoa_empresa")
public class PessoaEmpresa implements java.io.Serializable {
    
    //...   
    
    @OneToMany(mappedBy="pessoaEmpresa", fetch= FetchType.LAZY)
    private List<PessoaAdministrador> pessoaAdminitrador;

   //...

}
janjan

fiz assim agora e nada feito

@Entity
@Table(name = "MenuPefil")
public class MenuPerfil implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 987654323456789L;

	@Id
	@GeneratedValue
	Long surMenuPerfil;

	@ManyToOne
	@JoinColumn(name="surMenu")
	private List&lt;Menus&gt; menus;

	@OneToOne
	@JoinColumn(name = "surPerfil perfil", referencedColumnName = "surPerfil")
	Perfil perfil;
}

e 

@Entity
@Table(name="menus")
public class Menus implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 987654345678L;

	@Id
	@GeneratedValue
	private Long surMenu;

	private String url;

	private String descricao;

	@OneToMany
	@JoinColumn(name="surMenuPerfil")
	private MenuPerfil menuPerfil;
}

e acontece o seguinte erro

Exception in thread "main" org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.sentinela.model.Menus.menuPerfil
	at org.hibernate.cfg.annotations.CollectionBinder.getCollectionBinder(CollectionBinder.java:266)
	at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1448)
	at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:754)
	at org.hibernate.cfg.AnnotationConfiguration.processArtifactsOfType(AnnotationConfiguration.java:546)
	at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:291)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1333)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
janjan

perceba que no primeiro post que fiz eu coloquei a classe menus com problemas, nao anotei ela com entity e table
agora nesse ultimo teste anotei e aconteceu essa exception que coloquei ai…

faelbsr

Você está confundindo os relacionamentos… troque o ManyToOne pelo OneToMany e vice versa nos seus modelo…

Olhe o exemplo que eu postei e perceba que você inverteu os relacionamentos…

janjan

tu é ninja meu jovem, valeu pela ajuda… funcionou simplesmente invertendo!

estou me familiarizando com hibernate…
e tá uma briga feia ainda!!!

abraços!

faelbsr

Fico contente que conseguiu, coloca [RESOLVIDO] ai e sucesso…

Criado 18 de novembro de 2011
Ultima resposta 19 de nov. de 2011
Respostas 9
Participantes 2