2015-07-19 12 views
25

To pytanie zostało zadane wcześniej, ale rozwiązanie nie rozwiązało problemu. Tworzę test JUnit:Nieobsługiwane dla operacji DML z zapytaniem o aktualizację JPA

@Test 
    @Transactional 
    @Modifying 
    public void updateMaterialInventory() throws Exception{ 

     // Initialize the database 
     materialRepository.saveAndFlush(material); 

     long id = material.getId(); 
     materialRepository.updateMaterialInventory(id,UPDATED_INVENTORY_COUNT); 

     assertEquals(material.getInventory_count(), UPDATED_INVENTORY_COUNT, 0); 
    } 

Zapytanie powyższy test jest wywołanie jest:

@Query("UPDATE Material m SET m.inventory_count = ?2 WHERE m.id = ?1") 
    void updateMaterialInventory(Long id,int newInventoryAmount); 

Błąd:

Caused by: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [UPDATE com.htd.domain.Material m SET m.inventory_count = ?2 WHERE m.id = ?1] 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.errorIfDML(QueryTranslatorImpl.java:318) 
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:369) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) 
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495) 
    ... 55 more 

Odpowiedz

61

@Modifying adnotacja musi być umieszczony na metodzie updateMaterialInventory, wraz z adnotacją @Query, aby dane Spring były znane, że zapytanie nie jest zapytaniem, które służy do wybierania wartości, ale do aktualizacji wartości.

+2

Dlaczego pojawia się wyjątek "Wykonywanie aktualizacji/usuwania" aktualizacji? – Kenji

+0

@Kenji Dodaj to: @ Transakcja (propagacja = Propagacja.REQUIRED, readOnly = false) – user64141

1

O ile rozumiem, nie należy używać adnotacji @Transactional w klasie repozytorium. Znajdź poniższą odpowiedź.

Service Impl class

import org.springframework.transaction.annotation.Transactional; 
... 
@Test 
@Transactional 
public void updateMaterialInventory() throws Exception{ 

    // Initialize the database 
    materialRepository.saveAndFlush(material); 

    long id = material.getId(); 
    materialRepository.updateMaterialInventory(id,UPDATED_INVENTORY_COUNT); 

    assertEquals(material.getInventory_count(), UPDATED_INVENTORY_COUNT, 0); 
} 

Repository class

import org.springframework.data.jpa.repository.Modifying; 
import org.springframework.data.jpa.repository.Query; 
... 

    @Modifying 
    @Query("UPDATE Material m SET m.inventory_count = ?2 WHERE m.id = ?1") 
    void updateMaterialInventory(Long id,int newInventoryAmount); 

upewnić używać poprawnych importu. mam nadzieję, że to jest pomocne.

Powiązane problemy