我对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集合的映射?如果我能做到这一点,那么我将能够使用日期作为地图中的关键字来访问当天的灯具集合。
答案 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对象之前设置双向关系。这意味着您必须在夹具中设置竞争对象以持久保存夹具对象和关系。