CrudRepository bulk delete

Schuriko

Bekanntes Mitglied
Ich habe eine Repository
Java:
public interface LanguageRepository extends CrudRepository<Language, Long> {
    @Modifying
    @Query("delete from Language l where l.id in ?1")
    void deleteWithIds(List<Long> ids);
}

und eine Test Funktion
Code:
@RunWith(SpringRunner.class)
@SpringBootTest
public class LanguageRepositoryTest {
    /**
     * test deleteWithIds
     */
    @Test
    public void testDeleteWidthIds() {
        // initialize
        String nameValue1="name";
        String isoValue1="iso";

        Language language1 = new Language(nameValue1, isoValue1);
       
        languageRepository.save(language1);

        String nameValue2="name2";
        String isoValue2="iso2";

        Language language2 = new Language(nameValue2, isoValue2);
       
        languageRepository.save(language2);
       
        String nameValue3="name3";
        String isoValue3="iso3";

        Language language3 = new Language(nameValue3, isoValue3);
       
        languageRepository.save(language3);
       
        List<Long> ids = new ArrayList<>();
       
        ids.add(language1.getId());
        ids.add(language3.getId());
       
        // test
        Optional<Language> foundLanguage1 = languageRepository.findById(language1.getId());
        Optional<Language> foundLanguage2 = languageRepository.findById(language2.getId());
        Optional<Language> foundLanguage3 = languageRepository.findById(language3.getId());
       
        assertTrue(foundLanguage1.isPresent());
        assertTrue(foundLanguage2.isPresent());
        assertTrue(foundLanguage3.isPresent());

        languageRepository.deleteWithIds(ids);

        Optional<Language> foundLanguage1 = languageRepository.findById(language1.getId());
        Optional<Language> foundLanguage2 = languageRepository.findById(language2.getId());
        Optional<Language> foundLanguage3 = languageRepository.findById(language3.getId());
       
        assertFalse(foundLanguage1.isPresent());
        assertTrue(foundLanguage2.isPresent());
        assertFalse(foundLanguage3.isPresent());
     }
}
Allerdings tritt bei
Code:
languageRepository.deleteWithIds(ids);

ein Fehler auf
org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:396)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy111.deleteWithIds(Unknown Source)
at com.abado.pts.repositories.LanguageRepositoryTest.testDeleteWidthIds(LanguageRepositoryTest.java:161)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1586)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.orm.jpa.SharedEntityManagerCreator$DeferredQueryInvocationHandler.invoke(SharedEntityManagerCreator.java:402)
at com.sun.proxy.$Proxy127.executeUpdate(Unknown Source)
at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:256)
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:605)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$invoke$3(RepositoryFactorySupport.java:595)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:595)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
... 42 more

Ich verstehe nur nicht so ganz was ich hier falsch mache.
 

Schuriko

Bekanntes Mitglied
Hat sich soeben erledigt.
Für alle die es interessiert. Ich hatte vergessen @Transactional anzugeben. Korrekt muss es also lauten
Code:
@Test
    @Transactional
    public void testDeleteWidthIds() {
....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L MySQL Prepared Statement batch langsamer als bulk insert? Datenbankprogrammierung 10
E bulk mit java? Datenbankprogrammierung 10
E Was bedeutet die Konsistenzbedingung "ON DELETE RESTRICT"? Datenbankprogrammierung 6
A Eclipse + Derby + Delete Row Datenbankprogrammierung 3
K Tabellenübegreifendes DELETE möglich? Datenbankprogrammierung 5
K Db4o Delete Problem Datenbankprogrammierung 11
alex_fairytail MySQL SQL Statement Delete zwischen Datum1 und Datum2 Datenbankprogrammierung 5
S HSQLDB DELETE-Statement funktioniert nicht Datenbankprogrammierung 4
M Mysql Delete ohne Where Klausel untersagen Datenbankprogrammierung 8
T DB2 delete/update über 2 Tabellen Datenbankprogrammierung 2
M DELETE FROM via Java Datenbankprogrammierung 7
V Delete From Tabelle, ohne vorher die Tabelle zu kennen Datenbankprogrammierung 5
Z DELETE-Statement Datenbankprogrammierung 6
C delete Datenbankprogrammierung 8
-MacNuke- Hibernate Bi-Directional delete Datenbankprogrammierung 3
B MySql DELETE Anweisung gibt Fehler zurück Datenbankprogrammierung 7
D Delete Befehl will irgendwie nicht Datenbankprogrammierung 8
D Brauche hilfe bei Delete mit Datum! Datenbankprogrammierung 4
A delete aus datenbank, funktioniert nicht so richtig Datenbankprogrammierung 10
G Problem mit Delete-Statement Datenbankprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben