2

私は Play フレームワークと yml 表記が初めてで、Hibernate の基本だけを知っています。.yml ファイルを使用していくつかのテスト データを設定しようとしています。同じコンペティション オブジェクトを参照する複数の Question オブジェクトと ActiveCompetition オブジェクトを定義しようとしています。私の .yml ファイルは次のようになります (関係ないと思われるものは削除しました)。

ActiveCompetition(1): &myactivecompetition
    activeCompetition: &mycompetition
        name: Name of the competition

Question(11):
    title: Title 1
    competition: *mycompetition

Question(12):
    title: Title 2
    competition: *mycompetition

Question(13):
    title: Title 3
    competition: *mycompetition

私は動作しますが、Hibernate は *mycompetition を 4 回保存しているようです。

Java Bean では、javax.persistence の属性は次のように設定されます。

@Entity
@Transactional
public class ActiveCompetition extends Model {

   @Required
   @OneToOne(cascade= CascadeType.ALL)
   private Competition activeCompetition;
}

@Entity
@Transactional
public class Question extends Model {

    ...

    @Required
    @OneToOne(cascade= CascadeType.ALL)
    private Competition competition;
}

*mycompetition をデータベースに一度だけ保存する必要があることを Hibernate に理解させるにはどうすればよいですか? .yml ファイルにデータベース ID を書き込む必要がありますか? もしそうなら、どうすればいいですか?たとえば、「id: 99」を activeCompetition の下に追加しようとしましたが、役に立ちません。

4

1 に答える 1

1

次の 2 つの問題が考えられます。

最初の 1 つは、関係 OneToOne を宣言していることですが、YAML ファイルで ManyToOne 関係を作成します。OneToOne は、各 ActiveCompetition に最大で 1 つの質問があり、各質問が最大で 1 つの ActiveCompetition に関連することを意味します。

あなたが望むのは、ActiveCompetition に多くの Question がある ManyToOne 関係です。Java コードを更新する必要があります。

2 つ目は、ActiveCompetition を次のように定義していることです。

ActiveCompetition(1)

YAML では、AFAIK では、エンティティで提供される参照によって、ファイル内の他のエンティティを参照します (または、それが私が行った方法です)。上記の宣言では、参照は1() の間の数字です。

したがって、ファイルを次のように変更する必要があります。

Question(13):
    title: Title 3
    competition: 1
于 2012-04-25T07:49:07.627 に答える