我只是尝试用hibernate完成我的第一步。
因此,我生成了一个包含两个表(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)
答案 0 :(得分:1)
您只需要一个标准的多对多映射和查询
select g from Geraet g where SIZE(g.stadorts) > 1
答案 1 :(得分:1)
hibernate的想法是表示和操作像对象一样的sql表数据。 (维基ORM)
如果你有两个实体--Geraet和Standorts有一些关系,在休眠中你不需要第三个实体,它代表两个实体之间的许多关系。
在hibernate查询(hql)中,您需要忽略关系表并通过字段引用另一个实体,如 JB Nizet 。