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
[code]<?xml version="1.0" encoding="UTF-8"?>
[/code]Mapeamento de Especie
[code]<?xml version="1.0" encoding="UTF-8"?>
[/code]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*/;