使用Hibernate进行Spring,从另一个表连接数据并映射到新的帮助对象

使用Hibernate进行Spring,从另一个表连接数据并映射到新的帮助对象,hibernate,spring,join,Hibernate,Spring,Join,首先,我得说我对春天和冬眠很陌生 现在我的情况是:我有一个名为Places的表,它有:Id PK、name和description。 我有第二个名为Edges的表,它有:ID PK、fromPlaces(fk到来自places的PK ID)和toPlaces(也引用来自places的ID) 现在我想做一个查询,它最终将映射到一个对象,该对象将有我的Edge对象加上fromPlace引用和TopPlaces引用的名称 目前我的DAO中有一个功能正常的: public List<Edge>

首先,我得说我对春天和冬眠很陌生

现在我的情况是:我有一个名为Places的表,它有:Id PK、name和description。 我有第二个名为Edges的表,它有:ID PK、fromPlaces(fk到来自places的PK ID)和toPlaces(也引用来自places的ID)

现在我想做一个查询,它最终将映射到一个对象,该对象将有我的Edge对象加上fromPlace引用和TopPlaces引用的名称

目前我的DAO中有一个功能正常的:

public List<Edge> listEdges() {
    return sessionFactory.getCurrentSession().createQuery("from Edge")
            .list();
}

不要少考虑表格,多考虑对象


您需要一个具有1:m关系的边对象来放置引用和引用。首先,您需要映射实体。这是一个很好的开始

Edge
Places
的链接(顺便说一句,用复数命名您的实体令人困惑;我认为这就是为什么duffymo建议的集合)应该映射为
@ManyToOne

一旦这样做,上面的
listEdges
方法将返回一个
Edge
对象列表,其中每个对象都有(可能是惰性填充的)
getFromPlaces()
getToPlaces()
方法返回适当的
Places
实例

现在,如果要返回一个单独的helper对象,该对象包含
Edge
,并且只包含相关
位置
实体的名称,则必须创建该对象以及相应的构造函数并编写查询

这是一个更先进的,虽然-我建议你得到第一部分的工作,并研究与懒惰的协会工作,然后再继续进行这项工作

编辑(基于问题更新):

您的
映射应该类似于:

@Entity
@Table(name = "EDGES")
public class Edge {

    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne
    @JoinColumn(name="FROMPLACE")
    private Place fromPlace;

    @ManyToOne
    @JoinColumn(name="TOPLACE")
    private Place toPlace;
}

请注意,没有必要在名称与列名匹配的字段上指定
@Column
。还请注意,通常使用“\u ID”后缀来表示外键(例如“FROMPLACE\u ID”)-如果这样做,也可以省略
@JoinColumn
声明。

可以,但我的案例真的是一对多关系吗?我可以只给toPlace和fromPlace各配一根吗?因此,答案可能类似于在Edge模型中定义两个具有关系(oneToMany或oneToOne)的新place对象,这些关系将映射到toPlace integer列?关于表的内容仍然太多,对于对象的内容还不够。两个地点到和从的集合。让Hibernate找出如何填充这两个1:m关系。DArkO具有“from”和“to Places”的外键。它们不可能是集合,它们应该映射为@ManyToOne。我的对象是位置和边缘。在本教程中,我还介绍了映射:。这是路吗?我有点被你说的getFromPlaces返回一个place对象搞糊涂了。我已将fromPlaces定义为一个整数,其中包含引用的id fromPlaces。我会用模型编辑我的代码。我发现这个我认为可以根据你的解释做我需要的@DArkO-应该映射实体(对象),而不是其标识符。以上评论作品中的例子;Hibernate注释文档也有很多示例:好的,请再说一件事。当我删除某个边行中的某个地方是fk时,如何删除关联的边行?好的,不管我怎么想。我已经在我的问题中添加了这个,以防有人需要它。再次感谢你的帮助。
   @Entity
    @Table(name = "EDGES")
    public class Edge {

        @Id
        @Column(name = "ID")
        @GeneratedValue
        private Integer id;

        @ManyToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="FROMPLACE_ID")
    private Place fromPlace;

    @ManyToOne(fetch=FetchType.EAGER)
        @JoinColumn(name="TOPLACE_ID")
    private Place toPlace;

        @Column(name="COST")
        private Integer cost;
@Entity
@Table(name = "EDGES")
public class Edge {

    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne
    @JoinColumn(name="FROMPLACE")
    private Place fromPlace;

    @ManyToOne
    @JoinColumn(name="TOPLACE")
    private Place toPlace;
}