如何访问java hibernate manytomany映射表

时间:2017-04-09 18:20:31

标签: java hibernate hql

我只是尝试用hibernate完成我的第一步。

因此,我生成了一个包含两个表(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)

2 个答案:

答案 0 :(得分:1)

您只需要一个标准的多对多映射和查询

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

答案 1 :(得分:1)

hibernate的想法是表示和操作像对象一样的sql表数据。 (维基ORM)

如果你有两个实体--Geraet和Standorts有一些关系,在休眠中你不需要第三个实体,它代表两个实体之间的许多关系。

在hibernate查询(hql)中,您需要忽略关系表并通过字段引用另一个实体,如 JB Nizet