2017-11-29 24 views
0

나는 아래와 같이 두개의 테이블을 가지고있다.Hibernate OneToMany리스트 매핑 문제

TableOne 
    id pk 
    code varchar (references a column in TableTwo, non unique) 

TableTwo 
    id pk 
    code varchar (referenced in TableOne, non unique) 
    option 

표 1에서 하나의 id는 하나의 코드 만 가질 수 있습니다. 표 2에서 코드는 다른 옵션에 대해 반복 될 수 있습니다. 즉 code + option은 유일 할 것입니다 (DB에서 제약 조건을 정의한 것은 아닙니다).

@Entity 
@Table(name = "TableOne") 
public class Table1 { 
    @Id 
    @Column(name = "id") 
    private String id; 

    @OneToMany(mappedBy = "table1", fetch = FetchType.EAGER) 
    private List<Table2> table2s; 
} 

@Entity 
@Table(name = "TableTwo") 
public class Table2 { 
    @Id 
    @Column(name = "id") 
    private String id; 

    @ManyToOne 
    @JoinColumn(name = "code", referencedColumnName = "code", nullable = false, insertable = false, updatable = false) 
    private Table1 table1; 
} 

내 응용 프로그램을 실행하려고

아래에 설명 된대로

지금, 나는 그것이 오류 다음 부여합니다 내 엔티티 클래스를

org.springframework.orm.jpa.JpaSystemException: Found shared references to a collection: model.Table1.table2s; nested exception is org.hibernate.HibernateException: Found shared references to a collection: model.Table1.table2s 
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:333) ~[spring-orm-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:244) ~[spring-orm-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:521) ~[spring-orm-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) [spring-tx-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) [spring-tx-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504) [spring-tx-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292) [spring-tx-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) [spring-tx-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) [spring-aop-4.3.12.RELEASE.jar:4.3.12.RELEASE] 
at au.th.api.assessment.service.MasterQuestionsServiceImpl$$EnhancerBySpringCGLIB$$e50ce6a4.getQuestionById(<generated>) [classes/:na] 

같은 코드가 TableOne에서 두 개의 행이 있습니다 . TableTwo에는 해당 코드가있는 행이 하나뿐입니다.

여기 좀 도와주세요.

편집 : 나는 referencedColumnName로을 제거하면

, 그것은 잘 작동하지만 목록이 비어 있습니다.

디버깅시 트랜잭션이 커밋되기 전에 목록 개체가 PersistentBag로 페치됩니다. 커밋시 예외 사항을 발생시킵니다. 예외 전에 인쇄 된 오류

o.h.i.ExceptionMapperStandardImpl  : HHH000346: Error during managed flush [org.hibernate.HibernateException: Found shared references to a collection: model.Table1.table2s] 
+0

당신의 테이블의 이름은 무엇입니까에서 작업 예를 찾을 수 있습니까? 'Table2' 또는'TableTwo'? –

+0

@KenrySanchez, 너는 빠르다. ;-). 나는 그것을 정정하기 위해 나의 질문을 편집했다. – Maz

+0

'@OneToMany (mappedBy = "table1", fetch = FetchType.EAGER)'를'@OneToMany (mappedBy = "TableTwo", fetch = FetchType.EAGER)로 바꾼다면 –

답변

0

OneToMany 관계에 대한 실수가 있습니다. 아래 예를 참조하십시오.

@Entity 
@Table(name = "course") 
public class Course implements Serializable{ 

    private int id; 
    private Set<Student> students; 

    public Course(){ 
    }  

    @OneToMany(mappedBy = "course", cascade = CascadeType.ALL) 
    public Set<Student> getStudents() { 
     return students; 
    } 
} 

@Entity 
public class Student implements Serializable{ 

    private int id; 
    private Course course; 

    @ManyToOne 
    @JoinColumn(name = "course_id") 
    public Course getCourse() { 
     return course; 
    } 
} 

당신은 포스트 OneToMany relationship

+0

음, 내 경우 ** 코드 **는 기본 키가 아닙니다. 비 기본 키를 매핑해야합니다. – Maz