[resolvido] Problema com Mapeamento OneToMany (MySql + Hibernate)

5 respostas
lucianosousa

Fala ai pessoal...
seguinte, estou tentando fazer um mapeamento one to many, onde existe uma classe empresa e outra login.

Quando gera os bancos, o hibernate gera 3 bancos:
empresas,
login,
empresas_login,

este último com as fields:
empresas_id_empresa;
login_id_login

O fucionamento é: uma empresa pode ter muitos logins, mas, um login pode perterncer somente a uma empresa. Minhas classes estão assim:

import java.util.HashSet;
import java.util.Set;

import javax.persistence.*;

@Entity (name="empresas")
public class Empresa {
	
	@Id
	@GeneratedValue	
	private int id;
	private String nome;
	
	@OneToMany
	private Set<Login> login = new HashSet<Login>();
	
	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNome() {
		return nome;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	public void setLogins(Set<Login> logins) {
		this.login = logins;
	}

	public Set<Login> getLogins() {
		return login;
	}	
}

Classe Login:

import javax.persistence.*;

@Entity(name = "login")
public class Login {

@Id
@GeneratedValue
private int id;
private String nome;
private String usuario;
private String senha;

@ManyToOne(targetEntity = Empresa.class)
@JoinColumn(name="empresa", nullable=false)
private Empresa empresa;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getUsuario() {
return usuario;
}

public void setUsuario(String usuario) {
this.usuario = usuario;
}

public String getSenha() {
return senha;
}

public void setSenha(String senha) {
this.senha = senha;
}

public void setEmpresa(Empresa empresa) {
this.empresa = empresa;
}

public Empresa getEmpresa() {
return empresa;
}
}

meu Empresa.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="Empresa" table="empresas">
  
    <id name="id" column="id_empresa" type="int" unsaved-value="0">
    <generator class="increment"/>
    </id>
    
    <property name="nome" column="nome" type="string"/>
    
    <set name="login">
      
      <key column="id_empresa"/>  
      <one-to-many class="Login"/>  
      
    </set> 
    
               
    
  
  </class>

</hibernate-mapping>

Login.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="Login" table="login">
  
  <id name="id" column="id_login" type="int" unsaved-value="0">
  <generator class="increment"/>
  </id>
  
  <many-to-one class="Empresa" name="Empresa" column="id_empresa"
  foreign-key="FK_id_empresa" not-null="true"/>
  
  
  <property name="nome" column="nome" type="string"/>
    
  
  
  </class>
  
</hibernate-mapping>

por fim, meu hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

  <session-factory>
  					
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
    <property name="hibernate.connection.url">jdbc:mysql://localhost/sistemachamado</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password"></property>
    <property name="hibernate.show.sql">true</property>
    <property name ="hibernate.format.sql">true</property>
    
    <mapping class="Login" />
    <mapping class="Empresa" />
    
    <mapping resource="Empresa.hbm.xml" />
    <mapping resource="Login.hbm.xml" />
               
  </session-factory>

</hibernate-configuration>

5 Respostas

J

sim e qual o problema, seja mais específico!!!???

lucianosousa
JackOld:
sim e qual o problema, seja mais específico!!!???

bem, o problema é a criação das tabelas...

não consigo fazer o mapeamento entre elas...
alterei meus arquivos, pois, estava fazendo o mapeamento duplicado:

Login.java
public class Login {

	private int id;
	private String usuario;
	private String senha;
		
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}
}
Login.hbm.xml
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

  <class name="Login" table="login">
  
  <id name="id" column="id_login" type="int" unsaved-value="0">
    <generator class="increment"/>
  </id>
  
  <many-to-one name="Empresa" class="Empresa" column="id_empresa" />
  
  
  <property name="usuario" column="usuario" type="string" />
  <property name="senha" column="senha" type="string" />
    
  
  
  </class>
  
</hibernate-mapping>
Empresa.java
public class Empresa {
	
	private int id;
	private String nome;
	
	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getNome() {
		return nome;
	}

	public void setId(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}
}
Empresa.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>


	<class name="Empresa" table="empresas">
		
    <id name="id" column="id_empresa" type="int" unsaved-value="0">
      <generator class="increment"/>
    </id>
    
        
    <property name="nome" column="nome" type="string"/>
    
  
  </class>

</hibernate-mapping>

erro no prompt ao tentar adicionar uma empresa no sistema:

Exception in thread "main" org.hibernate.MappingException: entity class not found: Login
	at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:99)
	at org.hibernate.tuple.PropertyFactory.getGetter(PropertyFactory.java:168)
	at org.hibernate.tuple.PropertyFactory.buildIdentifierProperty(PropertyFactory.java:44)
	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:118)
	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:425)
	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1218)
	at br.com.cashcomputadores.tests.AdicionaEmpresa.main(AdicionaEmpresa.java:18)
Caused by: java.lang.ClassNotFoundException: Login
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClassInternal(Unknown Source)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Unknown Source)
	at org.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:100)
	at org.hibernate.mapping.PersistentClass.getMappedClass(PersistentClass.java:96)
	... 9 more
G

Você está usando annotations + XML, onde o correto é apenas UM ou OUTRO. Meu conselho é usar apenas annotations, excluindo os antigos HBMs.

lucianosousa

isso é algo que eu ainda não entendi, começei com anotação, depois me disseram que padrão era xml… (aqui eu misturei tudo)

nos últimos códigos postados só usei xml…

lucianosousa

resolvido usando somente anotação:

Empresa:

@OneToMany(mappedBy = "empresa", fetch = FetchType.EAGER)
    private Collection<Login> login;

Login:

@ManyToOne
    private Empresa empresa;
Criado 21 de outubro de 2009
Ultima resposta 21 de out. de 2009
Respostas 5
Participantes 3