如何访问 java hibernate manytomany 映射 table

how to access a java hibernate manytomany mapping table

我刚开始尝试使用休眠。

因此我生成了一个包含两个 table 的简单数据库(geraet 和 stadort)。

tables 有一个多对多的映射,hibernate 创建了第三个映射-table(正如预期的那样)。

(图片只显示主键)

插入一些值后我想查询数据库。我想从一个 table (geraet) 中获取所有条目,这些条目在映射 table 中出现不止一次。

在常规情况下 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

不幸的是,我不知道如何在休眠中执行此操作。

我最后一次尝试是为映射 table 编写 java class。不幸的是,我无法使用休眠访问此 table,因为自动生成的映射 table 没有单个主键列(主键是两列的组合)。

现在我正在考虑将我的多对多映射拆分为两个独立的一对多映射。但我希望有更有效的方法吗?

我最后一次尝试的重要 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.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)

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

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

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

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

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