2016-04-03 3 views
0

У меня есть метод в DAO, как показано ниже,JPA при обновлении сущность

public void updateEntity1(Entity2) { 
    Entity1 = entitymanager.find(....); 
    Entity1.setAttr(Entity2.getAttr()); 
    ......... 
    entitymanager.merge(Entity1); 
    em.flush(); 
} 

Я хочу обновить Entity1 со значением entity2 содержит, в конце метода, я считаю, entity1-х атр успешно обновлен, но в База данных не изменилась? Есть ли что-то неправильно с этим методом?

+1

Вам необходимо совершить транзакцию. – aribeiro

+0

Я просто решу эту проблему: Entity1 = entitymanager.find (....); em.clear(); когда я добавляю метод clear(), Entity1 будет успешно обновляться в БД, но я не знаю, почему, может ли кто-нибудь объяснить это? –

ответ

0

спасибо за помощь , Я узнаю интересную причину, касающуюся кэш поиска:

Entity1 был в кеше из-за прежнего поиска, например. это attr = 1;

но в другой транзакции, это атр была выставиться до 2, поэтому данные кэша грязных данных,

выше, я просто хочу, чтобы установить Entity1 атр назад к 1, но данные кэша еще 1, так JPA думал, что я ничего не изменил, поэтому em.merge() ничего не делает.

Это впечатляет!

1

Попробуйте ограждающих ваш код в сделке, как показано ниже:

entityManager.getTransaction().begin(); 
....//your code 
entityManager.getTransaction().commit(); 
0

Если транзакция уже доступен (в противном случае попробуйте решение @Madhusudana Reddy Sunnapu) попробуйте:

public void updateEntity1(entity2) { 
    Entity1 entity1 = entitymanager.find(...); 
    Entity1.setAttr(entity2.getAttr()); 
    ... 
    entity2.detach(); 
    entitymanager.merge(entity1); 
    em.flush(); 
} 
Смежные вопросы