2017-04-09 9 views
0

난 그냥 최대 절전 모드로 내 첫 단계를 수행하려고했습니다.java 하이버 네이트 manytomany 매핑 테이블에 액세스하는 방법

따라서 두 테이블 (geraet 및 stadort)을 사용하여 간단한 데이터베이스를 생성했습니다.

테이블은 many to many 매핑을 가지고 있고, hibernate는 (예상대로) 제 3 매핑 테이블을 생성한다.

(사진 그냥 기본 키를 보여줍니다)

enter image description here

일부 값을 삽입 한 후 나는 데이터베이스를 조회하고 싶습니다. 맵핑 테이블에서 둘 이상의 항목이있는 테이블 (geraet)의 모든 항목을 가져 오려고합니다. 불행하게도 내가 최대 절전 모드에서이 작업을 수행하는 방법을 알아낼 수 없습니다

select ge.* 
from geraet ge 
inner join gsm g on ge.id=g.geraet_id 
inner join standort s on g.standorts_id=s.id 
group by ge.id 
having count (g.geraet_id)>1 

:

일반 SQL에서 내가 좋아하는 일을 할 것입니다.

마지막으로 매핑 테이블에 자바 클래스를 작성하려고했습니다. 불행히도 자동으로 생성 된 매핑 테이블에는 단일 기본 키 열 (기본 키는 두 열 이상의 조합)이 없기 때문에 최대 절전 모드를 사용하여이 테이블에 액세스 할 수 없었습니다.

이제 두 개의 독립적 인 일대 다 매핑에서 많은 매핑을 여러 매핑로 분할하려고합니다. 그러나 더 효율적인 방법이 있기를 바랍니다.

다음과 같은 예외가 발생
package myclasses; 

import javax.persistence.Entity; 
import javax.persistence.Table; 

@Entity 
@Table (name="gsm") 
public class GSM { 

    private int geraet_id; 
    private int standorts_id; 
    public int getGeraet_id() { 
     return geraet_id; 
    } 
    public void setGeraet_id(int geraet_id) { 
     this.geraet_id = geraet_id; 
    } 
    public int getStandorts_id() { 
     return standorts_id; 
    } 
    public void setStandorts_id(int standorts_id) { 
     this.standorts_id = standorts_id; 
    } 
} 

public class Main { 

    public static void main(String[] args) { 
     ... 
     List<GSM>gsmlist = session.createCriteria(GSM.class).list(); 
     for (GSM aktuell : gsmlist) 
     { 
      System.out.println(aktuell.getGeraet_id()+" "+aktuell.getStandorts_id()); 
     } 
     session.getTransaction().commit(); 
     session.close(); 
     factory.close(); 
    } 
} 

가 :

Exception in thread "main" org.hibernate.AnnotationException: No identifier specified for entity: myclasses.GSM 
at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:266) 
at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:211) 
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:731) 
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:249) 
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222) 
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265) 
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83) 
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418) 
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691) 
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:726) 
at myclasses.Main.main(Main.java:24) 

답변

1

당신이 필요로하는 모든 표준은 다 대다 매핑하고,

내 마지막 시도에 대한 중요한 자바 코드처럼 보이는 쿼리

select g from Geraet g where SIZE(g.stadorts) > 1 
1

최대 절전 모드의 생각은 개체와 같은 SQL 테이블 데이터를 나타내고 조작하는 것입니다. (위키 ORM)

일부 관계가있는 Geraet 및 Standorts가있는 경우 최대 절전 모드에서는 두 엔티티 간의 많은 관계를 나타내는 세 번째 엔티티가 필요하지 않습니다.

최대 절전 모드 쿼리 (hql)에서는 JB Nizet과 같이 관계 테이블을 무시하고 필드를 통해 다른 엔터티를 참조해야합니다.