2017-04-09 55 views
0

我只是試圖做我的第一步與休眠。如何訪問java休眠manytomany映射表

因此,我生成了一個簡單的數據庫與兩個表(geraet和stadort)。

這些表具有多對多映射,並且hibernate創建第三個映射表(如預期的那樣)。

(圖片只示出了主鍵)

enter image description here

插入一些值後我想查詢數據庫。我想從一個表(geraet)中獲取映射表中有多個匹配項的所有條目。

在常規的SQL我會做這樣的事情:

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 

不幸的是我無法弄清楚,如何在休眠做到這一點。

我最後的嘗試是寫映射表的java類。不幸的是我無法使用hibernate訪問這張表,因爲自動生成的映射表沒有一個主鍵列(主鍵是兩列的組合)。

現在我正在考慮將我的多對多映射分解爲兩個獨立的一對多映射。但我希望有一個更有效的方法?

我的最後一次嘗試的重要的Java代碼如下所示:

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

hibernate的想法是表示和操作像對象一樣的sql表數據。 (wiki ORM)

如果你有兩個實體 - 具有一些關係的Geraet和Standorts,在休眠時你不需要第三個實體,它代表了兩個實體之間的許多關係。

在hibernate查詢(hql)中,您需要忽略關係表,並通過字段引用另一個實體,如JB Nizet