복붙노트

[SPRING] JoinTable을 사용하여 JPA 자체 조인

SPRING

JoinTable을 사용하여 JPA 자체 조인

부모 항목을 자식에 연결할 수있게하려는 엔티티 호출 항목이 1 개 있습니다. 조인 테이블을 사용하여 상위 / 하위 관계를 작성합니다. 나는 좋은 문서를 얻을 수 없었다. 그래서 누군가가 어떤 생각을 가지고 있다면 나는 모든 귀입니다.

여기에 내가 가지고있는 것이있다 ... 대부분의 경우에 효과가있다.

public class Item implements java.io.Serializable {
     @Id
     private Long id;

     @ManyToOne(optional = true, fetch = FetchType.LAZY)
     @JoinTable(name = "ITEMTOITEM", joinColumns = { @JoinColumn(name = "ITEMID") }, inverseJoinColumns = { @JoinColumn(name = "PARENTITEMID") } )
     private Item parent;

     @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
     private List<Item> children;
}

때때로이 항목 테이블에 연결된 객체를 다시 가져 오려는 경우 다음과 같은 오류가 발생합니다.

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.webflow.engine.ActionExecutionException: Exception thrown executing [AnnotatedAction@6669ff5 targetAction = com.assisted.movein.web.common.nav.NavAction@6edf74b7, attributes = map['method' -> 'handleEntry']] in state 'oneTimeChargesAndFeesView' of flow 'in-flow' -- action execution attributes were 'map['method' -> 'handleEntry']'; nested exception is Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.0.1 (Build b04-fcs (04/11/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: ORA-00904: "PARENTITEM_ITEMID": invalid identifier

 Error Code: 904
 Call: SELECT ITEMID, ITEMSHORTDESC, EFFENDDATE, ITEMDESC, PARENTITEM_ITEMID,  ITEMTYPECODE FROM ITEM WHERE (ITEMID = ?)
    bind => [1250]
Query: ReadObjectQuery(com.domain.Item)

어떤 도움을 주시면 감사하겠습니다.

해결법

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

    1.@JoinColumninstead를 사용해보십시오.

    @JoinColumninstead를 사용해보십시오.

     @ManyToOne(optional = true, fetch = FetchType.LAZY)
     @JoinColumn(name = "PARENTITEMID", referencedColumnName = "ITEMID")
     private Item parent;
    
     @OneToMany(
            cascade = {CascadeType.ALL},
            orphanRemoval = true,
            fetch = FetchType.LAZY
     )
     @JoinColumn(name = "PARENTITEMID")
     private List<Item> children;
    
  2. ==============================

    2.@JoinTable은 @OneToOne 또는 @OneToMany 또는 @ManyToMany에서만 허용됩니다. @ManyToOne에 대해서는 아무런 의미가 없다고 생각합니다. @JoinColumn 또는 @OneToOne을 사용하십시오.

    @JoinTable은 @OneToOne 또는 @OneToMany 또는 @ManyToMany에서만 허용됩니다. @ManyToOne에 대해서는 아무런 의미가 없다고 생각합니다. @JoinColumn 또는 @OneToOne을 사용하십시오.

    또한 @OneToMany는 이해할 수 없습니다. mappedBy는 속성이어야하며 parentItem이없고 부모이어야하며 부모는 @JoinColumn을 사용해야합니다.

  3. ==============================

    3.JPA 2.0에 대한 많은 책을 읽은 후에, 내가하려고했던 것을 지원하기 위해 Eclipselink 2.3+의 새로운 버전이 필요하다는 것을 알아 냈습니다. 필자의 경우 실제로 작동 한 코드는 있지만, 이전 버전 [EclipseLink 2.0.2]에 대한 의존성으로 인해 작동하지 않습니다. 또 다른 프로젝트는 아직이 표기법을 좋아하는 Toplink-essentials JPA 1.0을 사용하고 있습니다.

    JPA 2.0에 대한 많은 책을 읽은 후에, 내가하려고했던 것을 지원하기 위해 Eclipselink 2.3+의 새로운 버전이 필요하다는 것을 알아 냈습니다. 필자의 경우 실제로 작동 한 코드는 있지만, 이전 버전 [EclipseLink 2.0.2]에 대한 의존성으로 인해 작동하지 않습니다. 또 다른 프로젝트는 아직이 표기법을 좋아하는 Toplink-essentials JPA 1.0을 사용하고 있습니다.

    public class Item {
    
    @ManyToOne(optional = true, fetch = FetchType.LAZY)
    @JoinTable(name = "ITEMINCENTIVESMAPPING", 
            joinColumns = { @JoinColumn(name = "INCENTIVEITEMID", referencedColumnName = "ITEMID", insertable = false, updatable = false) }, 
            inverseJoinColumns = { @JoinColumn(name = "ITEMID", referencedColumnName = "ITEMID", insertable = false, updatable = false) } )
    private Item parentItem;
    
    @OneToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "ITEMINCENTIVESMAPPING", 
            joinColumns = { @JoinColumn(name = "INCENTIVEITEMID", referencedColumnName = "ITEMID") }, 
            inverseJoinColumns = { @JoinColumn(name = "ITEMID", referencedColumnName = "ITEMID") } )
    private List<Item> items;
    
    }
    
  4. from https://stackoverflow.com/questions/15216321/jpa-self-join-using-jointable by cc-by-sa and MIT license