最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

java - ObjectOptimisticLockingFailureException when run test - Stack Overflow

programmeradmin1浏览0评论

The following error occurs when executing the test org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.study.cardStudy.entity.Card#1] . When I simply run program all works fine!

I tried to add field with @Version in Card and Deck entiy. Tried to add @Transactional(propagation = NOT_SUPPORTED) over the test. I think error occurs because transactional executed twice.

CardEntity

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "card")
public class Card {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "card_id")
    private Long cardId;
    @Column(name = "id_in_deck")
    private Long idInDeck;
    @Column(name = "term")
    private String term;
    @Column(name = "definition")
    private String definition;
    @ManyToOne
    @JoinColumn(name = "deck_id")
    private Deck deck;
}

CardRepository

@Repository
public interface CardRepository extends JpaRepository<Card, Long> {
    Card findCardByIdInDeckAndDeck(long IdinDeck, Deck deck);

    @Transactional
    @Modifying
    @Query(value = "INSERT into card (term,definition,id_in_deck,deck_id) " + "VALUES (:#{#card.term},:#{#card.definition},:#{#card.idInDeck},:#{#card.deck.deckId})", nativeQuery = true)
    int insertCard(@Param("card") Card card);

    @Transactional
    @Modifying
    @Query(value = "UPDATE Card SET term = :#{#card.term}, definition = :#{#card.definition} WHERE (deck_id = :#{#card.deck.deckId} AND id_in_deck =:#{#card.idInDeck})", nativeQuery = true)
    void updateCard(@Param("card") Card card);

    @Transactional
    @Modifying
    @Query(value = "DELETE  FROM Card WHERE (deck_id = :#{#card.deck.deckId} AND id_in_deck =:#{#card.idInDeck})", nativeQuery = true)
    void deleteCard(@Param("card") Card card);
}

Deck


@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "deck")
public class Deck {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "deck_id")
    private Long deckId;
    @Column(name="title")
    private String title;
    @OneToMany(mappedBy = "deck", cascade = CascadeType.ALL,orphanRemoval = true)
    private List<Card> cardList;

}

DeckRepository

@Repository
public interface DeckRepository extends JpaRepository<Deck, Long> {
    Deck findDeckByTitle(String title);
}

DeckServiceImpl

@Service
@AllArgsConstructor
public class DeckServiceImpl implements DeckService {
    public DeckRepository deckRepository;
    public CardRepository cardRepository;
    public final DeckMapper deckMapper;


    @Override
    @Transactional
    public DeckDto createDeck(DeckDto deckDto) {
        Deck deck = deckMapper.mapToDeck(deckDto);
        deck.getCardList().forEach(card -> card.setDeck(deck));

        Deck existingDeck = deckRepository.findDeckByTitle(deck.getTitle());
        if (existingDeck != null) {
            existingDeck.getCardList().sort(Comparatorparing(Card::getIdInDeck));
            long deckId = existingDeck.getDeckId();
            deck.getCardList().forEach(card -> {
                card.getDeck().setDeckId(deckId);
                Card existingCard = cardRepository.findCardByIdInDeckAndDeck(card.getIdInDeck(), existingDeck);
                if (existingCard != null) {
                    cardRepository.updateCard(card);
                } else {
                    cardRepository.insertCard(card);
                }
            });

            int sizeNewDeck = deck.getCardList().size();
            int sizeOldDeck = existingDeck.getCardList().size();
            boolean isNewDeckSmallerThanExisting = sizeNewDeck < sizeOldDeck;

            if (isNewDeckSmallerThanExisting) {
                Iterator<Card> cardListIterator = existingDeck.getCardList().listIterator(sizeOldDeck - sizeNewDeck);
                while (cardListIterator.hasNext()) {
                    Card currentCard = cardListIterator.next();
                    cardRepository.deleteCard(currentCard);
                }
                Card currentCard = cardListIterator.next();
                cardRepository.deleteCard(currentCard);
            }
        } else {
            deckRepository.save(deck);
        }

        DeckDto savedDeckDto = deckMapper.mapToDeckDto(deck);
        savedDeckDto.getCardList().forEach(cardDto -> cardDto.setDeckId(deck.getDeckId()));

        return savedDeckDto;
    }

Test

DeckServiceImplTests

@SpringBootTest
@Import(DeckServiceImpl.class)
class DeckServiceImplTests {
    @Autowired
    private DeckServiceImpl deckService;


    @Test
    void shouldReturnSavedDeckDtoAndCreateDeck() throws Exception {
        List<CardDto> cardDtoList = List.of(new CardDto(1L, 1L, "put", "класть", 1L), new CardDto(2L, 2L, "dig", "копать", 1L), new CardDto(3L, 3L, "cut", "резать", 1L));
        DeckDto deckDto = new DeckDto(1L, "english", cardDtoList);
        DeckDto savedDeckDto = deckService.createDeck(deckDto);
    }

}

Full error


org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.study.cardStudy.entity.Card#1]

    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:325)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:560)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:343)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:160)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223)
    at jdk.proxy2/jdk.proxy2.$Proxy132.save(Unknown Source)
    at com.study.cardStudy.service.impl.DeckServiceImpl.createDeck(DeckServiceImpl.java:59)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727)
    at com.study.cardStudy.service.impl.DeckServiceImpl$$SpringCGLIB$$0.createDeck(<generated>)
    at com.study.cardStudy.service.impl.DeckServiceImplTests.shouldReturnSavedDeckDtoAndCreateDeck(DeckServiceImplTests.java:27)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.study.cardStudy.entity.Card#1]
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:426)
    at org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:214)
    at org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:152)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:136)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:138)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:875)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:846)
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:258)
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:248)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:570)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:492)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:253)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:604)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:534)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:495)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:253)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:192)
    at org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:667)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:441)
    at org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:214)
    at org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:152)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:136)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:89)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:854)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:840)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:320)
    at jdk.proxy2/jdk.proxy2.$Proxy124.merge(Unknown Source)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:630)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158)
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:515)
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:284)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:752)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:174)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:149)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:69)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138)

The following error occurs when executing the test org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.study.cardStudy.entity.Card#1] . When I simply run program all works fine!

I tried to add field with @Version in Card and Deck entiy. Tried to add @Transactional(propagation = NOT_SUPPORTED) over the test. I think error occurs because transactional executed twice.

CardEntity

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "card")
public class Card {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "card_id")
    private Long cardId;
    @Column(name = "id_in_deck")
    private Long idInDeck;
    @Column(name = "term")
    private String term;
    @Column(name = "definition")
    private String definition;
    @ManyToOne
    @JoinColumn(name = "deck_id")
    private Deck deck;
}

CardRepository

@Repository
public interface CardRepository extends JpaRepository<Card, Long> {
    Card findCardByIdInDeckAndDeck(long IdinDeck, Deck deck);

    @Transactional
    @Modifying
    @Query(value = "INSERT into card (term,definition,id_in_deck,deck_id) " + "VALUES (:#{#card.term},:#{#card.definition},:#{#card.idInDeck},:#{#card.deck.deckId})", nativeQuery = true)
    int insertCard(@Param("card") Card card);

    @Transactional
    @Modifying
    @Query(value = "UPDATE Card SET term = :#{#card.term}, definition = :#{#card.definition} WHERE (deck_id = :#{#card.deck.deckId} AND id_in_deck =:#{#card.idInDeck})", nativeQuery = true)
    void updateCard(@Param("card") Card card);

    @Transactional
    @Modifying
    @Query(value = "DELETE  FROM Card WHERE (deck_id = :#{#card.deck.deckId} AND id_in_deck =:#{#card.idInDeck})", nativeQuery = true)
    void deleteCard(@Param("card") Card card);
}

Deck


@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "deck")
public class Deck {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "deck_id")
    private Long deckId;
    @Column(name="title")
    private String title;
    @OneToMany(mappedBy = "deck", cascade = CascadeType.ALL,orphanRemoval = true)
    private List<Card> cardList;

}

DeckRepository

@Repository
public interface DeckRepository extends JpaRepository<Deck, Long> {
    Deck findDeckByTitle(String title);
}

DeckServiceImpl

@Service
@AllArgsConstructor
public class DeckServiceImpl implements DeckService {
    public DeckRepository deckRepository;
    public CardRepository cardRepository;
    public final DeckMapper deckMapper;


    @Override
    @Transactional
    public DeckDto createDeck(DeckDto deckDto) {
        Deck deck = deckMapper.mapToDeck(deckDto);
        deck.getCardList().forEach(card -> card.setDeck(deck));

        Deck existingDeck = deckRepository.findDeckByTitle(deck.getTitle());
        if (existingDeck != null) {
            existingDeck.getCardList().sort(Comparator.comparing(Card::getIdInDeck));
            long deckId = existingDeck.getDeckId();
            deck.getCardList().forEach(card -> {
                card.getDeck().setDeckId(deckId);
                Card existingCard = cardRepository.findCardByIdInDeckAndDeck(card.getIdInDeck(), existingDeck);
                if (existingCard != null) {
                    cardRepository.updateCard(card);
                } else {
                    cardRepository.insertCard(card);
                }
            });

            int sizeNewDeck = deck.getCardList().size();
            int sizeOldDeck = existingDeck.getCardList().size();
            boolean isNewDeckSmallerThanExisting = sizeNewDeck < sizeOldDeck;

            if (isNewDeckSmallerThanExisting) {
                Iterator<Card> cardListIterator = existingDeck.getCardList().listIterator(sizeOldDeck - sizeNewDeck);
                while (cardListIterator.hasNext()) {
                    Card currentCard = cardListIterator.next();
                    cardRepository.deleteCard(currentCard);
                }
                Card currentCard = cardListIterator.next();
                cardRepository.deleteCard(currentCard);
            }
        } else {
            deckRepository.save(deck);
        }

        DeckDto savedDeckDto = deckMapper.mapToDeckDto(deck);
        savedDeckDto.getCardList().forEach(cardDto -> cardDto.setDeckId(deck.getDeckId()));

        return savedDeckDto;
    }

Test

DeckServiceImplTests

@SpringBootTest
@Import(DeckServiceImpl.class)
class DeckServiceImplTests {
    @Autowired
    private DeckServiceImpl deckService;


    @Test
    void shouldReturnSavedDeckDtoAndCreateDeck() throws Exception {
        List<CardDto> cardDtoList = List.of(new CardDto(1L, 1L, "put", "класть", 1L), new CardDto(2L, 2L, "dig", "копать", 1L), new CardDto(3L, 3L, "cut", "резать", 1L));
        DeckDto deckDto = new DeckDto(1L, "english", cardDtoList);
        DeckDto savedDeckDto = deckService.createDeck(deckDto);
    }

}

Full error


org.springframework.orm.ObjectOptimisticLockingFailureException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.study.cardStudy.entity.Card#1]

    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:325)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:560)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:343)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:160)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:165)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223)
    at jdk.proxy2/jdk.proxy2.$Proxy132.save(Unknown Source)
    at com.study.cardStudy.service.impl.DeckServiceImpl.createDeck(DeckServiceImpl.java:59)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727)
    at com.study.cardStudy.service.impl.DeckServiceImpl$$SpringCGLIB$$0.createDeck(<generated>)
    at com.study.cardStudy.service.impl.DeckServiceImplTests.shouldReturnSavedDeckDtoAndCreateDeck(DeckServiceImplTests.java:27)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1597)
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.study.cardStudy.entity.Card#1]
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:426)
    at org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:214)
    at org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:152)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:136)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:138)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:875)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:846)
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:258)
    at org.hibernate.engine.spi.CascadingActions$6.cascade(CascadingActions.java:248)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:570)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:492)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:253)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:604)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:534)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:495)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:253)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:192)
    at org.hibernate.event.internal.DefaultMergeEventListener.cascadeOnMerge(DefaultMergeEventListener.java:667)
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:441)
    at org.hibernate.event.internal.DefaultMergeEventListener.merge(DefaultMergeEventListener.java:214)
    at org.hibernate.event.internal.DefaultMergeEventListener.doMerge(DefaultMergeEventListener.java:152)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:136)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:89)
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:854)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:840)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:320)
    at jdk.proxy2/jdk.proxy2.$Proxy124.merge(Unknown Source)
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:630)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
    at java.base/java.lang.reflect.Method.invoke(Method.java:580)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:277)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:170)
    at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158)
    at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:515)
    at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:284)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:752)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:174)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:149)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:69)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:138)

Share Improve this question asked Jan 20 at 10:14 EgorEgor 331 silver badge9 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 1

Error occurs after version 6.6. You can downgrade the version or create your own id generator. Read more here

发布评论

评论列表(0)

  1. 暂无评论