如何访问 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。
我刚开始尝试使用休眠。
因此我生成了一个包含两个 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。