복붙노트

[SPRING] 같은 식별자 값을 가진 다른 객체가 이미 세션 오류와 관련이 있습니다. [duplicate]

SPRING

같은 식별자 값을 가진 다른 객체가 이미 세션 오류와 관련이 있습니다. [duplicate]

나는 최대 절전 모드 주석에 문제가있다. 두 클래스 사이에 양방향 관계가 있습니다. 다음은 매핑입니다 (axtavt 덕분에).

@Entity 
public class Receipt implements Serializable { 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "receipt")
    private List<Collection> collections; 
    ...
}      

@Entity 
public class Collection implements Serializable { 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    @ManyToOne 
    @JoinColumn(name="ReceiptId") 
    private Receipt receipt; 
    ...
}

하지만 다음을 사용하여 영수증을 수금액 목록에 저장하려고합니다.

Receipt r = new Receipt();
List<Collection> cols = new ArrayList<Collection>();
cols.add(new Collection());
r.setCollections(cols);
getHibernateTemplate().save(r);

이 오류를 생성합니다.

org.springframework.orm.hibernate3.HibernateSystemException: a different object with the same identifier value was already associated with the session: [com.coa.acctreports.pojo.Collection#0]; nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.coa.acctreports.pojo.Collection#0]
 at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:679)
 at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
 at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)
 at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
 at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)
 at com.coa.acctreports.daoImp.AccountingReportsImpl.save(AccountingReportsImpl.java:35)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

그러나 내가 그것을 바꿀 때

session.merge(receipt)

그것은 오류가 있지만 내 데이터베이스를 확인할 때 colliations 테이블에 receiptId fk null로 설정되어 있습니다 ... 어떤 도움을 주셔서 감사합니다. 감사합니다 ^ _ ^ ...

해결법

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

    1.Receipt의 mappedby annotation은 Collection이 실제로 관계의 소유 측이라는 것을 의미합니다. 이는 영수증을 계단식으로 처리 했으므로 의도 한 것이 아니기 때문입니다.

    Receipt의 mappedby annotation은 Collection이 실제로 관계의 소유 측이라는 것을 의미합니다. 이는 영수증을 계단식으로 처리 했으므로 의도 한 것이 아니기 때문입니다.

    영수증에서 mappedby를 제거하고 최대 절전 모드 문서에서 다음 예제를 따라야합니다.

    @Entity 
    public class Receipt implements Serializable { 
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
        @OneToMany(cascade = CascadeType.ALL)
        @JoinColumn(name="ReceiptId")
        private List<Collection> collections; 
        ...
    }      
    
    @Entity 
    public class Collection implements Serializable { 
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
    
        @ManyToOne 
        @JoinColumn(name="ReceiptId",insertable=false,updatable=false) 
        private Receipt receipt; 
        ...
    }
    

    위에서 수행 한 것과 동일한 코드를 사용하면 저장 작업을 수행 할 수 있습니다.

    이것에 대한 더 많은 정보가 있습니다 : http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

  2. from https://stackoverflow.com/questions/4194350/a-different-object-with-the-same-identifier-value-was-already-associated-with-th by cc-by-sa and MIT license