我只是試圖做我的第一步與休眠。如何訪問java休眠manytomany映射表
因此,我生成了一個簡單的數據庫與兩個表(geraet和stadort)。
這些表具有多對多映射,並且hibernate創建第三個映射表(如預期的那樣)。
(圖片只示出了主鍵)
插入一些值後我想查詢數據庫。我想從一個表(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)