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

2 respostas
javaeclipselink
G

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?

2 Respostas

G

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.

G

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…

Criado 15 de julho de 2016
Ultima resposta 18 de jul. de 2016
Respostas 2
Participantes 2