Hibernate - problemas com persistência

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;
	}
}

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

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?!

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.

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

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!

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?

Alguém teria mais alguma idéia?

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?

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…