최대 절전 모드가있는 선택적 ManyToOne

Polygnome

제공된 데이터베이스를 사용하여 값을 읽는 JavBeans + Hibernate 매핑으로 소스 라이브러리를 만들고 오픈 소스 라이브러리를 만들려고합니다 (읽기만하고 쓰기는하지 않음). 안타깝게도이 데이터베이스는 잘 설계되지 않았습니다.

내 문제는 선택적인 ManyToOne 관계에 있습니다. 즉, null이 될 수 있습니다.

다음은 두 테이블입니다 (첫 번째는 types, 두 번째는 metaTypes).

+--------+---------------+
| typeID |   typeName    |
+--------+---------------+
|      1 | Chair         |
|      2 | Table         |
|      3 | Picnic Table  |
|      4 | Bedside Table |
+--------+---------------+

+--------+--------------+
| typeID | parentTypeID |
+--------+--------------+
|      3 |            2 |
|      4 |            2 |
+--------+--------------+

자, 이제이 모든 것이 어떻게 함께 속하는 지에 대한 문제가 있습니다. 유형 테이블에는 존재할 수있는 항목 목록과 같은 모든 유형의 유형이 있습니다.

두 번째 표에서는 이러한 것들이 함께 그룹화됩니다. 보시다시피, "picnic table"에는 metaTypes테이블 유형 테이블의 하위 항목으로 테이블에 항목이 있습니다.

유형이 기본 유형 인 경우 metaTypes테이블에 해당 항목이 없습니다 . 잘 설계된 데이터베이스에서는 최소한 NULL이있는 항목이 존재하는 것을 제외하고는 parentTypeID되지만 그렇지 않습니다. 나는 이것을 @NotFound(action = NotFoundAction.IGNORE)에서 사용하여 해결했습니다 Type.

실제 데이터베이스에는 metaType추가 관련 정보를 포함 하는 테이블에 더 많은 열 이 있으므로 빈이 있어야합니다MetaType .

이 긴 소개 후에 실제 질문이 발생합니다.
a Type를 변형 ( MetaType)에 매핑 하려면 어떻게해야 합니까?

이것은 내가 시도한 것입니다 (축약, 게터 및 세터 대부분 생략).

@Entity
@Table(name = "types")
public class Type {

    @Id
    private int typeID;     
    private String typeName, description;

    // meta types/ variations

    @OneToOne
    @JoinColumn(name = "typeID", insertable = false, updatable = false, nullable = true)
    @NotFound(action = NotFoundAction.IGNORE)
    private MetaType metaType; // -> this works as expected

    @OneToMany
    @JoinColumn(name = "typeID", referencedColumnName = "parentTypeID")
    @NotFound(action = NotFoundAction.IGNORE)
    private List<MetaType> variations; // this doesn't work

    /**
     * This method is quite easy to explain: Either this type is a base
     * type, in which case it has no metaType but holds the variations directly,
     * or it is a dervied type, in which case we get it's parent type and list the
     * variations of the parent type.
     */
    public List<MetaType> getVariations () {
        if (metaType != null) {
            return metaType.getParentType().getVariations();
        }
        return variations;
    }
}

@Entity
@Table (name = "metaTypes")
public class MetaType {

    @Id
    private int typeID;

    private Integer parentTypeID;

    // id <> object associations

    @OneToOne (mappedBy = "metaType")
    @JoinColumn(name = "typeID", insertable = false, updatable = false)
    private Type type;

    @OneToOne
    @JoinColumn(name = "parentTypeID", referencedColumnName = "typeID", insertable = false, updatable = false)
    private Type parentType;
}

목표는 분명해야합니다. "Bedside Table"을 쿼리한다고 가정 해 보겠습니다. metaType은 null이 아니지만 변형 목록은 있어야합니다.

"Table"유형을 쿼리했다고 가정 해 보겠습니다. 이 경우 MetaType이없고 @NotFound주석 덕분에 자동으로 실패하고 metaType필드에 null이 있습니다. 여태까지는 그런대로 잘됐다. 그러나 "Table"에는의 typeID2있으므로 variations목록에 두 개의 항목이 포함될 것으로 예상 합니다. 그러나 대신 아래 예외가 발생합니다.

그러나 어떻게 든 이것이 작동하지 않으면 아래 예외가 발생합니다.

Exception in thread "main" java.lang.NullPointerException
    at org.hibernate.cfg.annotations.CollectionBinder.bindCollectionSecondPass(CollectionBinder.java:1456)
    at org.hibernate.cfg.annotations.CollectionBinder.bindOneToManySecondPass(CollectionBinder.java:864)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:779)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:728)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:70)
    at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1695)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1424)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844)

그렇다면 접근 방식에 무엇이 잘못되었으며 어떻게 작동하도록 할 수 있습니까?

에드윈 달로 조

좋아, 다음은 내가 한 방식이며 잘 작동하는 것 같습니다.

유형 엔티티

@Entity
public class Type {

    @Id
    @Column(name = "typeId")
    private Integer id;

    @Column(name="typeName")
    private String name;


    @OneToMany
    @JoinColumn(name="parentTypeId")
    List<MetaType> metaTypes;
}

my @OneToManymappedBy속성을 사용하지 않습니다 . 이 경우 @JoinColumn대신 사용 하고 있습니다. 이것은 단방향 관계입니다.

MetaType 엔티티

@Entity
public class MetaType {

    @Id
    private Integer id;

    @MapsId
    @OneToOne
    @JoinColumn(name = "typeId")
    private Type type;

    @ManyToOne
    @JoinColumn(name = "parentTypeId")
    private Type parentType;
}

이제 주어진 예와 같이 주어진 유형을 복구하고 올바른 데이터를 얻습니다.

TypeService service = ...;
Type t = service.getTypeById(2);

System.out.println(t.getName());
for(MetaType mt : t.getMetaTypes()){
    System.out.println("\t" + mt.getType().getName() + "-> " + mt.getParentType().getName());
}

이것은 출력을 생성합니다

Table
    Picnic Table-> Table
    Bedside Table-> Table

또한 변형이없는 유형에 대해서도 올바르게 작동합니다. 유형 2 (의자)를 쿼리하면 빈 변형 컬렉션이있는 의자가 표시됩니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

@ManyToOne 최대 절전 모드 매핑

분류에서Dev

최대 절전 모드-캐스케이드 옵션이있는 ManyToOne / OneToOne

분류에서Dev

최대 절전 모드-캐스케이드 옵션이있는 ManyToOne / OneToOne

분류에서Dev

최대 절전 모드 선택 방법

분류에서Dev

최대 절전 모드로 행 선택

분류에서Dev

최대 절전 모드로 선택

분류에서Dev

최대 절전 모드 종속 개체를 삭제 CASCADE (ManyToOne OneToMany)

분류에서Dev

최대 절전 모드를위한 JPA @ManyToOne

분류에서Dev

@ManyToOne에서 JPA 2.1 및 최대 절전 모드로 부분적으로 Java로드 엔티티

분류에서Dev

최대 절전 모드 @formula 선택 전용 필드

분류에서Dev

업데이트하기 전에 최대 절전 모드 선택

분류에서Dev

최대 절전 모드 n + 1 문제 해결 방법 OneToMany 및 ManyToOne

분류에서Dev

최대 절전 모드 검색에서 사용할 필드를 동적으로 선택할 수 있습니까?

분류에서Dev

최대 절전 모드 하위 선택 반환 null

분류에서Dev

최대 절전 모드에서 Postgresql '구별 선택'

분류에서Dev

최대 절전 모드 HQL 쿼리 선택

분류에서Dev

최대 절전 모드 선택 및 이상한 동작 삽입

분류에서Dev

내부 조인에서 최대 절전 모드 선택 오류

분류에서Dev

JPA / 최대 절전 모드 하위 선택 가져 오기에 대한 질문

분류에서Dev

Windows 최대 절전 모드 vs 종료 + 부팅 시간 : 왜 최대 절전 모드를 선택합니까?

분류에서Dev

가입없이 열을 조인의 선택 ID를 최대 절전 모드

분류에서Dev

최대 절전 모드에서 여러 열을 선택하는 기준 쿼리?

분류에서Dev

@ManyToOne와 오류 - JPA / 최대 절전 모드 분리 된 엔티티 지속에 전달

분류에서Dev

왜 최대 절전 모드 @OneToOne 여러 선택 쿼리 대신 하나를 실행 하는가?

분류에서Dev

세션의 적절한 사용 (최대 절전 모드)

분류에서Dev

추가시 ManyToOne 캐스케이드를 최대 절전 모드로 전환하지만 삭제시에는 연결하지 않음

분류에서Dev

최대 절전 모드 @ManyToOne 자체 참조 (단방향) 계단식 삭제 부모

분류에서Dev

최대 절전 모드, 최적화 목적으로 최대 절전 조건 목록 호출에 연결

분류에서Dev

ManyToOne 연결에서 최대 절전 모드 프록시 개체가 표시되지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    @ManyToOne 최대 절전 모드 매핑

  2. 2

    최대 절전 모드-캐스케이드 옵션이있는 ManyToOne / OneToOne

  3. 3

    최대 절전 모드-캐스케이드 옵션이있는 ManyToOne / OneToOne

  4. 4

    최대 절전 모드 선택 방법

  5. 5

    최대 절전 모드로 행 선택

  6. 6

    최대 절전 모드로 선택

  7. 7

    최대 절전 모드 종속 개체를 삭제 CASCADE (ManyToOne OneToMany)

  8. 8

    최대 절전 모드를위한 JPA @ManyToOne

  9. 9

    @ManyToOne에서 JPA 2.1 및 최대 절전 모드로 부분적으로 Java로드 엔티티

  10. 10

    최대 절전 모드 @formula 선택 전용 필드

  11. 11

    업데이트하기 전에 최대 절전 모드 선택

  12. 12

    최대 절전 모드 n + 1 문제 해결 방법 OneToMany 및 ManyToOne

  13. 13

    최대 절전 모드 검색에서 사용할 필드를 동적으로 선택할 수 있습니까?

  14. 14

    최대 절전 모드 하위 선택 반환 null

  15. 15

    최대 절전 모드에서 Postgresql '구별 선택'

  16. 16

    최대 절전 모드 HQL 쿼리 선택

  17. 17

    최대 절전 모드 선택 및 이상한 동작 삽입

  18. 18

    내부 조인에서 최대 절전 모드 선택 오류

  19. 19

    JPA / 최대 절전 모드 하위 선택 가져 오기에 대한 질문

  20. 20

    Windows 최대 절전 모드 vs 종료 + 부팅 시간 : 왜 최대 절전 모드를 선택합니까?

  21. 21

    가입없이 열을 조인의 선택 ID를 최대 절전 모드

  22. 22

    최대 절전 모드에서 여러 열을 선택하는 기준 쿼리?

  23. 23

    @ManyToOne와 오류 - JPA / 최대 절전 모드 분리 된 엔티티 지속에 전달

  24. 24

    왜 최대 절전 모드 @OneToOne 여러 선택 쿼리 대신 하나를 실행 하는가?

  25. 25

    세션의 적절한 사용 (최대 절전 모드)

  26. 26

    추가시 ManyToOne 캐스케이드를 최대 절전 모드로 전환하지만 삭제시에는 연결하지 않음

  27. 27

    최대 절전 모드 @ManyToOne 자체 참조 (단방향) 계단식 삭제 부모

  28. 28

    최대 절전 모드, 최적화 목적으로 최대 절전 조건 목록 호출에 연결

  29. 29

    ManyToOne 연결에서 최대 절전 모드 프록시 개체가 표시되지 않는 이유는 무엇입니까?

뜨겁다태그

보관