Duvida sobre mapeamento do hibernate e banco de dados

0 respostas
J

Criei uma aplicação Java cliente servidor, na qual a transmisão de informações entre o cliente e o servidor se da via arquivo.txt, todos os clientes geram informações novas em seus bancos locais os quais possuem as mesmas tabelas do servidor. De tempos em tempos é necessario atualizar o servidor com as novas informações dos clientes e após a atualização do servidor todo os cliente serão espelhados com o servidor. Para fazer o codigo de espellhamento do servidor com os cliente foi simples, mais encontrei um problema quando tentei atualizar o servidor. Para fazer a atualização do banco de dados do servidor eu pensei em gerar "Insert" SQL das novas informações do cliente.
Ex: O usuario cadastrou varias Espécies(Objeto Java com os atributos: nome , peso,.....), Então o programa ira gerar comandos de inserção SQL (insert into especie (nome , peso) values(...)) para cada especie, então esses comando serão armazenados num txt e o servidor ira ler esse arquivo.txt e executar os comados contidos no arquivo, imaginando que o servidor estaja vazio neste momento.
O problema acontece quando o segundo cliente vai atualizar o servidor, pois a chave primaria das tabelas são auto_increment, o segundo cliente também cadastrou especies, logo as chaves primarias das especies vão colidir e o maior problema é que a tabela de especie se relaciona com a tabela de grupo (N..1) , ou seja, a chave estrangeira também estará errada.
Visto esse problema tentei usar o hibernate e usando o netBeans 6.9 fiz o arquivo de engenharia reversa e com ele gerei o as classes e o mepeamento do hibernate automaticamente, para assim poder salvar os objetos mapeados num arquivo.txt e inserilos no banco. Más estou encontrando o seguinte erro:

26/07/2010 18:42:14 org.hibernate.util.JDBCExceptionReporter logExceptions
Erro hibernate Segunda tentativa -- could not insert: [Exportacao.DP.Especie]
SEVERE: Cannot add or update a child row: a foreign key constraint fails (`alometria`.`especie`, CONSTRAINT `especie_ibfk_1` FOREIGN KEY (`idGrupo`) REFERENCES `grupo` (`idGrupo`) ON DELETE CASCADE)

Gostaria de saber se tem alguma maneira de mapear as classes para resolver esse problema de chave estrangeira?

Banco Utilizado: MySQL

Mapeamento de grupo
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 24/07/2010 16:42:38 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
  <class catalog="alometria" name="Exportacao.DP.Grupo" table="grupo">
    <id name="idGrupo" type="java.lang.Integer">
      <column name="idGrupo"/>
      <generator class="identity"/>
    </id>
    <property name="nome" type="string">
      <column length="50" name="Nome" not-null="true" unique="true"/>
    </property>
    <property name="constante" type="double">
      <column name="Constante" not-null="true" precision="22" scale="0"/>
    </property>
    <property name="modificado" type="timestamp">
      <column length="19" name="Modificado" not-null="true"/>
    </property>    
  </class>
</hibernate-mapping>
Mapeamento de Especie
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 24/07/2010 16:42:38 by Hibernate Tools 3.2.1.GA -->
<hibernate-mapping>
  <class catalog="alometria" name="Exportacao.DP.Especie" table="especie">
    <id name="idEspecie" type="java.lang.Integer">
      <column name="idEspecie"/>
      <generator class="identity"/>
    </id>
    <many-to-one class="Exportacao.DP.Grupo" name="grupo" lazy="false">
      <column name="idGrupo" not-null="true"/>
    </many-to-one>
    <property name="nome" type="string">
      <column length="50" name="Nome" not-null="true" unique="true"/>
    </property>
    <property name="maxM" type="java.lang.Double">
      <column name="maxM" precision="22" scale="0"/>
    </property>
    <property name="maxF" type="java.lang.Double">
      <column name="maxF" precision="22" scale="0"/>
    </property>
    <property name="minM" type="java.lang.Double">
      <column name="minM" precision="22" scale="0"/>
    </property>
    <property name="minF" type="java.lang.Double">
      <column name="minF" precision="22" scale="0"/>
    </property>
    <property name="modificado" type="timestamp">
      <column length="19" name="Modificado" not-null="true"/>
    </property>
    
  </class>
</hibernate-mapping>
Tabelas do banco
#
# Table structure for table 'especie'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `especie` (
  `idEspecie` int(11) NOT NULL AUTO_INCREMENT,
  `idGrupo` int(11) NOT NULL,
  `Nome` varchar(50) NOT NULL,
  `maxM` double DEFAULT NULL,
  `maxF` double DEFAULT NULL,
  `minM` double DEFAULT NULL,
  `minF` double DEFAULT NULL,
  `Modificado` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`idEspecie`),
  UNIQUE KEY `Nome` (`Nome`),
  KEY `idGrupo` (`idGrupo`),
  CONSTRAINT `especie_ibfk_1` FOREIGN KEY (`idGrupo`) REFERENCES `grupo` (`idGrupo`) ON DELETE CASCADE
) ENGINE=InnoDB /*!40100 DEFAULT CHARSET=latin1*/;


#
# Table structure for table 'grupo'
#

CREATE TABLE /*!32312 IF NOT EXISTS*/ `grupo` (
  `idGrupo` int(11) NOT NULL AUTO_INCREMENT,
  `Nome` varchar(50) NOT NULL,
  `Constante` double NOT NULL,
  `Modificado` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`idGrupo`),
  UNIQUE KEY `Nome` (`Nome`)
) ENGINE=InnoDB /*!40100 DEFAULT CHARSET=latin1*/;
Criado 26 de julho de 2010
Respostas 0
Participantes 1