2011-02-24 6 views
15

У меня есть простой тест, где я пытаюсь обновить объект, но слияние, похоже, выполняет вставку вместо обновления.JPA Hibernate merge выполняет вставку вместо обновления

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:spring/app-context.xml","classpath:spring/testdb-context.xml"}) 
public class UserJPATest { 
@Test 
public void testUpdate() throws Exception { 
    System.out.println("update"); 

    User entity = ObjectManager.USER_DAO.findById(3L); 
    entity.setUsername("harryUpdate"); 

    ObjectManager.USER_DAO.update(entity); 

    User selEntity = ObjectManager.USER_DAO.findById(3L); 
    Assert.assertEquals(entity.getUsername(),selEntity.getUsername()); 
} 

}

Это мой метод обновления

@Override 
@Transactional(propagation= Propagation.REQUIRES_NEW) 
public T update(T entity) throws Exception { 
    try { 
     T merged = entityManager.merge(entity); 
     return merged; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new Exception(e); 
    } 
} 

Обновление кода

@Override 
@Transactional(propagation= Propagation.REQUIRES_NEW) 
public T update(T entity) throws Exception { 
    try { 
     T merged = null; 
     BaseEntity baseEntity = null; 
     if(entity instanceof BaseEntity){ 
      baseEntity = (BaseEntity)entity; 
      merged = entityManager.find(entityClass, baseEntity.getId()); 
     } 
     merged = entityManager.merge(entity); 
     entityManager.flush(); 
     return merged; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new Exception(e); 
    } 
} 


Теперь я получаю следующее сообщение об ошибке Не удалось совершить JPA сделки; вложенное исключение - javax.persistence.RollbackException: транзакция, помеченная как rollbackOnly

+0

Как вы определяете, что он выполняет вставку? – axtavt

+0

Я не ** действительно ** люблю ** REQUIRES_NEW ** распространение, вы можете создать объект в TX, а затем выполнить «слияние или обновление» в другом TX, который не знает об исходном организация. – Augusto

+0

Я проверил журналы и попытался сделать вставку – user373201

ответ

22

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

+0

хорошо, я пришел по той же проблеме .. :) –

+0

Спасибо user373201, я боролся с этим, и я натолкнулся на ваше предложение, как только я изменил версию, он начал работать так, как он предположил бы. Благодарю. – Richipal

+0

version column, который, у меня тоже есть проблема, я установил весь столбец базы данных, но он все еще вставляет запись вместо update.help – Mufrah

Смежные вопросы