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>
<?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>
#
# 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*/;