[SPRING] JoinTable을 사용하여 JPA 자체 조인
SPRINGJoinTable을 사용하여 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.@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.@JoinTable은 @OneToOne 또는 @OneToMany 또는 @ManyToMany에서만 허용됩니다. @ManyToOne에 대해서는 아무런 의미가 없다고 생각합니다. @JoinColumn 또는 @OneToOne을 사용하십시오.
@JoinTable은 @OneToOne 또는 @OneToMany 또는 @ManyToMany에서만 허용됩니다. @ManyToOne에 대해서는 아무런 의미가 없다고 생각합니다. @JoinColumn 또는 @OneToOne을 사용하십시오.
또한 @OneToMany는 이해할 수 없습니다. mappedBy는 속성이어야하며 parentItem이없고 부모이어야하며 부모는 @JoinColumn을 사용해야합니다.
-
==============================
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; }
from https://stackoverflow.com/questions/15216321/jpa-self-join-using-jointable by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 바람둥이 봄 MVC 시작 예외를 해결하는 방법? (0) | 2019.07.16 |
---|---|
[SPRING] Spring과 Spring MVC 프레임 워크의 차이점은 무엇입니까? (0) | 2019.07.16 |
[SPRING] 주어진 도메인 클래스에 대한 스프링 데이터 저장소 인스턴스를 검색하는 방법은 무엇입니까? (0) | 2019.07.16 |
[SPRING] MessageSource가 특성 파일을 다시로드하지 않습니다. (0) | 2019.07.16 |
[SPRING] JBoss resteasy - 사용자 지정 Jackson 공급자 (0) | 2019.07.16 |