【问题标题】:Hibernate Mapping Help!休眠映射帮助!
【发布时间】:2011-03-06 22:05:10
【问题描述】:

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

我有 2 个实体,竞争和夹具。它们之间存在一对多的关系。我知道如何设置注释来实现这一点,但我正在努力使关系成为双向的。如果我的应用程序要运行很长时间,属于比赛的灯具数量会增加。我将访问 Fixture 对象的最常见方式是通过竞赛指定特定日期(例如 getFixtures(today))。我想我可以通过在 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 作为 Map 中的键来简单地访问当天的 Fixtures 集合。

【问题讨论】:

    标签: java hibernate annotations hibernate-annotations


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我相信您可以使用 Hibernate Entity Maps。以下线程将很有用:How to persist Map with Annotations 你也可以在Hibernate Cheatsheet上查找Entity Map

      【讨论】:

        【解决方案3】:
        @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 对象之前设置双向关系。这意味着您必须在夹具中设置竞赛对象以保持夹具对象和关系。

        【讨论】:

          猜你喜欢
          • 2010-10-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-05
          • 1970-01-01
          相关资源
          最近更新 更多