2015-07-19 9 views
25

Questo è stato richiesto una volta ma la soluzione non ha risolto il problema. Sto creando un test JUnit:Non supportato per le operazioni DML con query di aggiornamento 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); 
    } 

La query la prova di cui sopra sta chiamando è:

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

Errore:

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 

risposta

61

Il @Modifying annotazione deve essere posizionato sul metodo updateMaterialInventory, lungo l'annotazione @Query, per consentire a Spring-data di sapere che la query non è una query utilizzata per selezionare i valori, ma per aggiornare i valori.

+2

perché ottengo l'eccezione "Esecuzione di un aggiornamento/eliminazione query" all'aggiornamento? – Kenji

+0

@Kenji Aggiungere questo: @Transactional (propagation = Propagation.REQUIRED, readOnly = false) – user64141

1

Per quanto ho capito, non si dovrebbe usare l'annotazione @Transactional nella classe repository. Trova la risposta qui sotto.

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); 

assicurarsi di utilizzare le importazioni corrette. spero che questo sia utile.

Problemi correlati