Hibernate - problemas com persistência

9 respostas
ivela

Olá, pessoal!

Preciso de ajuda com um mapeamento que fiz no hibernate.
Tenho duas tabelas: personal e personal_type. A tabela personal possui uma foreign key para a personal_type. Tenho os seguintes dados nas tabelas (todos como VARCHAR e as primeiras colunas são chaves):

personal:
‘PESSOA1’, ‘Fulando da Silva’, ‘CLIENTE’
‘PESSOA2’, ‘Cicrano da Sirva’, ‘FORNECEDOR’
‘PESSOA3’, ‘Gertrudes da Silva’, ‘CLIENTE’
‘PESSOA4’, ‘Genoveva da Silva’, ‘CLIENTE’

personal_type:
‘CLIENTE’, ‘Cliente da Empresa’
‘FORNECEDOR’, ‘Fornecedor da Empresa’

Após instanciar objetos [color=blue]Personal[/color] ou [color=blue]PersonalType[/color], consigo alterar seus atributos corretamente, com exceção da foreign key.

Estou tentando este código:

import org.hibernate.*;
import org.hibernate.cfg.*;

public class Main
{
	public static void main(String args[])
	{
		Configuration config = new Configuration();
		config.configure("hibernate.cfg.xml");
		
		SessionFactory factory = config.buildSessionFactory();

		Session session = factory.openSession();
		
		Personal personal = (Personal) session.load(Personal.class, "PESSOA2");
		PersonalType type = (PersonalType) session.load(PersonalType.class, "CLIENTE");

		personal.setType(type);
		
		session.flush();
		session.close();
	 }
}

mas ele não atualiza a foreign key da tabela personal. Eu quero trocar a referência da foreign key do registro 2 de “FORNECEDOR” para “CLIENTE”.

Onde estou errando?

Mais dados:

Mapeamento das Tabelas

&lt?xml version="1.0" encoding="UTF-8"?&gt
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

	<!-- Mapeamento da classe Personal -->
	<class name="Personal">
		<id name="code"/>
		<property name="name"/>
		<many-to-one name="type" class="PersonalType" insert="false" update="false">
			<column name="code"/>
		</many-to-one>
	</class>

	<!-- Mapeamento da classe PersonalType -->	
	<class name="PersonalType" table="personal_type">
		<id name="code"/>
		<property name="description"/>
	</class>
		
</hibernate-mapping>

hibernate.cfg.xml

&lt?xml version='1.0' encoding='utf-8'?&gt
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>

		<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
		<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="connection.username">root</property>
		<property name="connection.password">123456</property>
		<property name="connection.autocommit">true</property>
		<property name="connection.pool_size">100</property>
		<property name="show_sql">true</property>
		<mapping resource="maps.hbm.xml"/>		
		
	</session-factory>
</hibernate-configuration>

log4j.properties

log4j.rootLogger=DEBUG, dest1   
log4j.appender.dest1=org.apache.log4j.ConsoleAppender   
log4j.appender.dest1.layout=org.apache.log4j.PatternLayout   
log4j.appender.dest1.layout.ConversionPattern=%d %-5p %-5c{3} %x -&gt %m%n

Classe Personal

public class Personal
{
	private String code;
	private String name;
	private PersonalType type;
	
	public String getCode()
	{
		return code;
	}
	
	public void setCode(String code)
	{
		this.code = code;
	}
	
	public String getName()
	{
		return name;
	}
	
	public void setName(String name)
	{
		this.name = name;
	}
	
	public PersonalType getType()
	{
		return type;
	}
	
	public void setType(PersonalType type)
	{
		this.type = type;
	}
}

Classe PersonalType

public class PersonalType
{
	private String code;
	private String description;
	
	public String getCode()
	{
		return code;
	}
	
	public void setCode(String code)
	{
		this.code = code;
	}
	
	public String getDescription()
	{
		return description;
	}
	
	public void setDescription(String type)
	{
		this.description = type;
	}
}

9 Respostas

D

Não tenho certeza, mas será que vc nao tem que mapear a associação one-to-many de PersonalType para Personal?

ivela

Hum,… acho que não porque eu não tenho nenhum campo da PersonalType que eu possa mapear com realcionamento . Ou será que eu teria que criar um campo apenas para fazer essa volta?!

valbercarreiro

No teu mapeamento many-to-one tenta colocar isso: cascade=“none” insert=“true” update=“true” q pod ser q d certo.
E no outro lado do mapeamento o one-to-many o mapeamento ta certo?
Espero q tenha ajudado.

ivela

Obrigado pela ajuda, mas não resolveu.
Continuo caminhando contra o vento, sem lenço, sem documento…

valbercarreiro

Cara dei uma olhada melhor no teu codigo e axo q p fazer esse mapeamento ai q vc ta querendo em vez d vc ter apenas um objeto PersonalType vc n teria q colocar uma coleção destes objetos Collection?
ai seu mapeamento one-to-many ficaria dentro de um set.

abraço!

ivela

Mas,…

No caso a foreign-key não estaria apontando para um registro específico da PersonalType? Ou seja, se eu atribuir uma instância diferente, ela não deveria associar com este novo registro?
E se eu mapeasse com uma Collection, como eu atribuiria a foreign-key à um registro específico?

ivela

Alguém teria mais alguma idéia?

L

De uma olhada em http://www.allapplabs.com/hibernate/hibernate_o_r_mapping_many_to_one_element.htm.

Eu acho que realmente vc deve modificar o seu cascade…só que não para none, mas para update…Dê uma lida na documentação.

além disso, vc não configurou como funciona o seu id. Vc tá setando ou o seu banco que seta?

H

Não sei se vc ainda está procurando…

As regras de integridade referencial são validadas somente nas tabelas innodb do mysql.
Li em algum lugar que em vez de

org.hibernate.dialect.MySQLDialect

deve-se usar:

org.hibernate.dialect.MySQLInnoDBDialect

Não sei se vai resolver, mas é uma idéia…

Criado 27 de junho de 2007
Ultima resposta 11 de ago. de 2007
Respostas 9
Participantes 5