Hibernate Mapping帮助!

时间:2011-03-06 22:05:10

标签: java hibernate annotations hibernate-annotations

我对Hibernate很陌生,所以我不完全确定我想做的事情是否可行(或正确的事情)所以如果不是,请随意提出其他方法来实现我正在寻找的东西对

我有2个实体,竞争和夹具。他们之间存在一对多的关系。我知道如何设置注释来实现这一点,但我正在努力的是使关系双向化。如果我的应用程序要运行很长时间,那么属于竞争对手的灯具数量会增加。我将访问Fixture对象的最常见方式是通过指定特定日期(例如getFixtures(今天))通过竞赛。我想我可以通过在Competition类中使用Map来实现这一点,该Map将Fixture的日期映射到该日期的Fixtures集合。我不知道如何在Hibernate中设置它。

这是一组简化的POJO和注释,用于说明我到目前为止所拥有的内容:

@Entity
public class Competition {

    // This is what I would like to have.
    private Map<Date, Collection<Fixture>> fixtureMap;

    public Collection<Fixture> getFixtures(Date day) {
        return fixtureMap.get(day);
    }

    // This is all I know how to do.
    private Collection<Fixture> fixtureList;

    @OneToMany(mappedBy = "competition")
    public Collection<Fixture> getFixtureList() {
        return fixtureList;
    }
}

@Entity
public class Fixture {

    private Competition competition;

    @ManyToOne
    public Competition getCompetition() {
        return competition;
    }
}

从中我可以看出,我可以设置关系,以便参加比赛的整套赛程。但是要获得特定日期的灯具,我将不得不迭代整个灯具集合并检查每个灯具的日期。有什么方法可以让Hibernate处理从Date到Fixtures集合的映射?如果我能做到这一点,那么我将能够使用日期作为地图中的关键字来访问当天的灯具集合。

3 个答案:

答案 0 :(得分:0)

没有直接注释可以提供帮助。您必须编写查询以获取特定日期的灯具。

答案 1 :(得分:0)

我相信你可以使用Hibernate Entity Maps。以下主题将非常有用:How to persist Map with Annotations 您还可以在Hibernate Cheatsheet

上查找实体地图

答案 2 :(得分:0)

@Entity
public class Competition 
{
   private Map<Date, Collection<Fixture>> fixtureMap;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "competition")
    @MapKey("date")
    public Collection<Fixture> getFixtures(Date day) 
    {
        return fixtureMap.get(day);
    } 
}

@Entity
public class Fixture 
{

    private Competition competition;

    private Date date;

    @Column(name="FIXTURE_DATE")
    public Date getDate() 
    {
        return date;
    }

    @ManyToOne
    public Competition getCompetition() 
    {
        return competition;
    }
}

请记住在保存Competition对象之前设置双向关系。这意味着您必须在夹具中设置竞争对象以持久保存夹具对象和关系。