1

私はHibernateを初めて使用するので、やりたいことが可能かどうか(または正しいことかどうか)完全にはわかりません。そうでない場合は、探していることを達成する他の方法を自由に提案してください。

コンペティションとフィクスチャの 2 つのエンティティがあります。それらの間には一対多の関係があります。これを達成するために注釈を設定する方法は知っていますが、私が苦労しているのは、関係を双方向にすることです。私のアプリケーションが長時間実行されると、競技会に属するフィクスチャの数が増えてしまいます。Fixture オブジェクトにアクセスする最も一般的な方法は、特定の日付を指定することによるコンペティション経由です (getFixtures(today) など)。私は、Fixture の日付をその日付の Fixtures のコレクションにマップする Map を Competition クラスに持つことで、これを実装できると考えました。ただし、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;
    }
}

このことからわかるように、競技用のフィクスチャのセット全体にアクセスするための関係を設定できます。しかし、特定の日の Fixtures を取得するには、Fixtures のコレクション全体を繰り返し処理し、それぞれの日付を確認する必要があります。Date からフィクスチャのコレクションへのマッピングを Hibernate に処理させる方法はありますか? それができれば、日付をマップのキーとして使用して、その日のフィクスチャのコレクションに簡単にアクセスできます。

4

3 に答える 3

0

直接の注釈は役に立ちません。特定の日付のフィクスチャをフェッチするためのクエリを作成する必要があります。

于 2011-03-06T22:17:58.547 に答える
0

Hibernate Entity Maps を使用できると思います。次のスレッドが役立ちます: How to persist Map with Annotationsまた、 Hibernate Cheatsheet でエンティティ マップを検索することもできます。

于 2011-03-06T22:21:46.010 に答える
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;
    }
}

コンペティション オブジェクトを保存する前に、必ず双方向の関係を設定してください。つまり、フィクスチャ オブジェクトと関係を永続化するには、フィクスチャ内に競合オブジェクトを設定する必要があります。

于 2011-03-07T07:54:03.347 に答える