[Resolvido] JPA com EclipseLink insere mesmos registros várias vezes

Estou com o seguinte problema usando o EclipseLink, criei o meu EntityManager da seguinte forma

emf = Persistence.createEntityManagerFactory(nomePu, new HashMap<String, String>() {
	private static final long serialVersionUID = 1L;
	{
	  put("javax.persistence.jdbc.url","jdbc:mysql://"+host+":"+porta+"/"+nomeBanco);
	  put("javax.persistence.jdbc.driver","com.mysql.jdbc.Driver");
	  put("javax.persistence.jdbc.password",senha);
	  put("javax.persistence.jdbc.user",usuario);
	  put("javax.persistence.schema-generation.database.action","create");
	  put("javax.persistence.schema-generation.create-source","metadata");
	  put("javax.persistence.schema-generation.drop-source","metadata");
	  put("javax.persistence.schema-generation.create-database-schemas","true");               
	  put("javax.persistence.sql-load-script-source","META-INF/sql/load_script.sql");
        }
}); 

Como podem ver, eu coloquei um .sql para ser carregado ao final da criação do esquema do banco. Basicamente para inserir na tabela de Estados todas as UF do Brasil. O problema é que, cada vez que eu executo o projeto, ele insere os mesmos registros novamente.

O que está errado nas propriedades do EntityManager, uma vez que eu quero que ele só seja criado uma vez o banco de dados, e por consequência, só uma vez seja adicionado os registros do .sql?

Acredito que você deve então melhorar o seu script sql para que ele verifique se o registro já existe na tabela e caso não exista ela insere, algo como:

INSERT INTO estado (nome, sigla)
SELECT * FROM (SELECT ‘Pará’, ‘PA’) AS tmp
WHERE NOT EXISTS (
SELECT sigla FROM estado WHERE sigla = ‘PA’
) LIMIT 1;

esse script faz basicamente isso que falei, se você executar uma vez esse script ele vai inserir o registro pois ainda não existe no banco, já na segunda vez ele não vai fazer nada pq vai detectar que o registro já existe e vai ignorar o insert.

Valeu Geraldo…

O que eu tive que fazer foi criar um índice em uma chave única, e trocar o insert simples pelo insert ignore.

Aí já resolveu o problema…

1 curtida