복붙노트

[SPRING] 복잡한 관계가있는 엔티티를 저장할 때의 StaleStateException

SPRING

복잡한 관계가있는 엔티티를 저장할 때의 StaleStateException

필자가 데이터베이스 (Oracle)에 저장하고있는 최대 절전 모드 엔티티에는 많은 관련 엔터티가 있다는 점에서 매우 복잡한 관계가 있습니다. 다음과 같이 보입니다.

@Table(name = "t_HOP_CommonContract")
public class Contract {
    @Id
    private ContractPK id;

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private ContractGroupMember contractGroupMember;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumns({
        @JoinColumn(name = "TransactionId", referencedColumnName = "TransactionId"),
        @JoinColumn(name = "PrimaryContractId", referencedColumnName = "PrimaryContractId")
    })
    @Fetch(FetchMode.SUBSELECT)
    private List<ContractLink> contractLinks;

    // . . . . . . . 

    // A couple of more one to many relationships

    // Entity getters etc.

}

나는 또한 같은 두 개의 엔티티가 ...

@Table(name = "t_HOP_TRS")
public class TotalReturnSwap {
    @Id
    private ContractPK id;
    // Entity Getters etc.
}

트릭은 동일한 트랜잭션에서 Contract 및 TotalReturnSwap 항목의 지속성을 유지해야한다는 것입니다.

때로는 동일한 트랜잭션에서 지속되어야하는 엔티티의 집합 일 수 있습니다.

TotalReturnSwap 엔터티를 저장할 때 다음 예외가 있음을 알았습니다 (계약 엔터티를 저장 한 후에 항상 수행됨).

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:675) \
    at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:793) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:664) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:147) 
    at com.rbs.fcg.publishing.DownstreamContractBusinessEventPostingService.performTDWPersistenceForContracts(DownstreamContractBusinessEventPostingService.java:102) 
    at com.rbs.fcg.publishing.DownstreamContractBusinessEventPostingService.persistContractBusinessEvent(DownstreamContractBusinessEventPostingService.java:87)
    at com.rbs.fcg.publishing.DownstreamContractBusinessEventPostingService.publish(DownstreamContractBusinessEventPostingService.java:67)
    at com.rbs.fcg.publishing.PublishingProcessor.publish(PublishingProcessor.java:76)
    at com.rbs.fcg.publishing.PublishingProcessor.process(PublishingProcessor.java:52)
    at com.rbs.are.MultiThreadedQueueItemProcessor$2.run(MultiThreadedQueueItemProcessor.java:106)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)
Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
    at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
    at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)

이제는 질문에 대답하는 데 도움이되는 몇 가지 요령이 있습니다.

해결법

  1. ==============================

    1.오류는 여러 가지 원인으로 발생할 수 있습니다.

    오류는 여러 가지 원인으로 발생할 수 있습니다.

    나는 그것을 위해 신용을 얻지 않고있다, 그것을 여기에서 발견했다.

  2. ==============================

    2.이것은 다음과 같은 상황에서 나에게 일어났다.

    이것은 다음과 같은 상황에서 나에게 일어났다.

    대답은 개체를 업데이트하거나 데이터베이스에서 개체의 새로운 인스턴스를 검색해야한다는 것입니다.

  3. from https://stackoverflow.com/questions/11733803/stalestateexception-when-saving-entity-with-complex-relations by cc-by-sa and MIT license