[RESOLVIDO] Problemas com insert no hibernate

5 respostas Resolvido
springhibernatejava
T

Ultimamente tenho reparado que o hibernate tem apresentado problemas. Eu criei uma sequencia de insert’s para teste. Sempre que testo, derrubo e levanto o Tomcat, usando a configuração create-drop do hibernate (limpando e criando as tabelas novamente).

Na maioria das vezes, essa sequencia de insert apresenta sucesso. Porém, acredito que nos outros 40% o hibernate faz simplesmente um duplo insert em um mesmo campo, nessa minha lista de insert’s. Estou utilizando o spring gerenciar as transações. Mas acredito que este não seja o problema.

Alguém já passou por esse tipo de problema?

Employee employee = new Employee();
employee.setCpf("[telefone removido]");
Calendar calendar = new GregorianCalendar();
calendar.set(1947, 7, 27);
employee.setDateOfBirth(calendar);
employee.setGenre("M");
employee.setFirstName("Thiago");
employee.setLastName("Sales");
entityManager.persist(employee);

UserPassword userPassword = new UserPassword();
userPassword.setEmployee(employee);
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String password = bCryptPasswordEncoder.encode("123");
userPassword.setPassword(password);
userPassword.setUsername("ts");
Role role = new Role();
role.setName(TypeUser.ROLE_ADMIN);
userPassword.setRoles(new ArrayList<Role>(Arrays.asList(role)));
entityManager.persist(userPassword);

Product product = new Product();
product.setEmployee(employee);
product.setName("cs");
product.setDescription("Peça de marfim");
entityManager.persist(product);

Product product2 = new Product();
product2.setEmployee(employee);
product2.setName("ce");
product2.setDescription("Peça de bronze");
entityManager.persist(product2);

Product product3 = new Product();
product3.setEmployee(employee);
product3.setName("co");
product3.setDescription("Peça de ouro");
entityManager.merge(product3);

Product product4 = new Product();
product4.setEmployee(employee);
product4.setName("ca");
product4.setDescription("Peça de prata");
entityManager.persist(product4);

Agreement agreement = new Agreement();
agreement.setName("SCC");
entityManager.persist(agreement);

Plan plan = new Plan();
plan.setBaseValue(new BigDecimal(22.23));
plan.setCreationDate(Calendar.getInstance());
plan.setDescription("pouca coisa");
plan.setEmployee(employee);
plan.setName("bronze");
plan.setActive(true);
List<Product> products = new ArrayList<Product>();
products.add(product);
products.add(product2);
plan.setProducts(products);
entityManager.persist(plan);

Plan plan2 = new Plan();
plan2.setBaseValue(new BigDecimal(22.23));
plan2.setCreationDate(Calendar.getInstance());
plan2.setDescription("Muita coisa coisa");
plan2.setEmployee(employee);
plan2.setName("prata");
plan2.setActive(true);
List<Product> products2 = new ArrayList<Product>();
products2.add(product);
products2.add(product2);
plan2.setProducts(products2);
entityManager.persist(plan2);

Branch branch = new Branch();
branch.setAgreement(agreement);
branch.setName("SCC");
entityManager.persist(branch);

AgreementPlan agreementPlan = new AgreementPlan();
agreementPlan.setPlan(plan);
agreementPlan.setAgreement(agreement);
entityManager.persist(agreementPlan);

AgreementPlan agreementPlan2 = new AgreementPlan();
agreementPlan2.setPlan(plan2);
agreementPlan2.setAgreement(agreement);
entityManager.persist(agreementPlan2);

5 Respostas

Mateus_Malaquias1

Tem o código?

T

@Mateus_Malaquias1 , editei a pergunta para colocar o código do insert lá.

Foi como eu disse… se eu derrubar e subir, fazendo um “create-drop” na base, 60% ou mais das vezes ele faz corretamente. Não entendo como pode fazer os mesmos insert’s de maneira diferente.

Nesses momentos de erro, o log do hibernate diz que o “employee” é adicionado duas vezes no no persist(employee) ou uma outra vez(extra) no último persist do código que eu passei.

Mateus_Malaquias1

Já tive problema uma vez com o hibernate gerando dados duplicados quando usei Cascade nos mapeamentos das entidades, como estão as suas?

T

Todas as entidades que se relacionam com Employee não estão marcadas com Cascade.

Isso pra mim é um mistério… Kk… Parece que o Hibernate tem vida própria. Uma hora ele decide fazer duas inserções e outra hora não (Lembrando que isso, por enquanto, foi apenas em um “first insert” que eu fiz, para poder executar e testar o sistema).

T
Solucao aceita

Já matei o problema.

Parece que o navegador está guardando os dados da última requisição. Por isso que, quando eu desço e subo o servidor, o navegador está fazendo duas requisições. Por isso que está fazendo um duplo insert.

Tomara que isso não dê problemas futuramente, em situações normais.

Criado 1 de julho de 2016
Ultima resposta 1 de jul. de 2016
Respostas 5
Participantes 2