2011-01-25 6 views
7

私はちょうどPlay Framework WebアプリケーションでJPAスキーマを構築し始めています。私はSQLの合理的な理解を持っていますが、私はJPAの初心者です、そして、私は最初のハードルでトリップされています。基本的なJPAの問題:「タイプを判別できませんでした:java.util.Set」

Playチュートリアルからは、Javaクラスを作成するだけで、JPA/Playが自動的にスキーマを作成すると仮定しています。

だから私は2つのモデルクラス、Rankableとタグ間の多対多の関係を作成します:

@Entity 
public class Tag extends Model { 
    public String name; 
    public String description; 
    private Set<Rankable> rankables; 

    @ManyToMany(mappedBy = "tags") 
    public Set<Rankable> getRankables() { 
     return rankables; 
    } 

    @ManyToMany(mappedBy = "tags") 
    public void setRankables(final Set<Rankable> r) { 
     rankables = r; 
    } 
} 

しかし、私は次のエラーを取得しておく:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Rankable extends Model { 
    public String name; 
    private Set<Tag> tags; 

    @ManyToMany() 
    @JoinTable(name = "RANKABLE_TAGS") 
    public Set<Tag> getTags() { 
     return tags; 
    } 

    @ManyToMany() 
    @JoinTable(name = "RANKABLE_TAGS") 
    public void setTags(final Set<Tag> tags) { 
     this.tags = tags; 
    } 
} 

そして、他のクラス

A JPA error occurred (Unable to build EntityManagerFactory): Could not determine type for: java.util.Set, at table: Rankable, for columns: [org.hibernate.mapping.Column(tags)]

私は間違っていますか?

+0

モデルは次のように何を見ていますか? – kem

+1

@kem - [Model](http://www.playframework.org/documentation/api/1.1/play/db/jpa/Model.html)は、フレームワークのクラスの1つです –

+0

余分な '}'はあなたのコードまたは単に投稿エラー? –

答えて

2

これが動作するように見え、いくつかゲッターの上に。言い換えれば、特定のフィールドでは、注釈はフィールド上またはゲッター上のいずれかでなければなりません。 getterでそれらを組み合わせることで、私たちにとって問題が解決しました。例外のように、問題の本当の原因が示されていないようです。 、我々は多対多の注釈のために、この構文を使用ところで :

  1. エンティティ:

    @ManyToMany 
    @JoinTable(name = "join_table", joinColumns = { @JoinColumn(name = 
    "leftjoinid") }, inverseJoinColumns = { @JoinColumn(name = "rightjoinid") }) 
    
  2. エンティティ:

    @ManyToMany 
    @JoinTable(name = "join_table", joinColumns = { @JoinColumn(name = 
    "rightjoinid") }, inverseJoinColumns = { @JoinColumn(name = "leftjoinid") }) 
    
0

@ManyToManyのように見えません。

おそらく、注釈の配置とは混同している可能性があります。 getterに対応するセッター(setTags())が付いていることを確認し、他のすべての注釈もプロパティー(フィールドではなく)に配置されていることを確認してください。我々の場合には

@Entity 
public class Tag extends Model { 
    public String name; 
    public String description; 

    @ManyToMany(mappedBy = "tags", cascade = CascadeType.ALL) 
    public Set<Rankable> rankables; 
} 

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
public class Rankable extends Model { 
    @ManyToOne(cascade = CascadeType.ALL) 
    public User creator; 

    public String name; 

    @ManyToMany() 
    public Set<Tag> tags; 
} 
+0

ああ、対応するセッターはありませんでした。彼らはセッターと同じアノテーションを持つ必要がありますか? – sanity

+0

いいえ、私はセッターを追加しました。すべての注釈はフィールドではなくメソッド上にあります(私は現在、2つのモデルオブジェクトしか持っていません。まだ同じエラーが発生しています:-( – sanity

+2

コンパイル時にフレームワークによって動的に生成されるので、Play Frameworkモデルでセッターを宣言する必要はありません。 –

7

、その理由は、我々は、フィールド上のいくつかの注釈を持っていたことだった:私はなぜわからないが、最終的には

+0

どのように1対1?それは同じですか? –

関連する問題