2016-12-11 2 views
0

Ebean:団体と予期しない動作、私は「単一表の継承」戦略を使用して2つの機種を持って継承

@Entity 
@Inheritance 
@DiscriminatorColumn(name="user_type") 
@Table(name="users") 
public class User extends Model { 
    ... 
} 

@Entity 
@DiscriminatorValue("manager") 
public class Manager extends User { 
    .... 
} 

私もManagerに多対一の関連を持っているEventモデルを持っています。

@Entity 
@Table(name="events") 
public class Event extends Model { 

    @ManyToOne 
    @JoinColumn(name = "user_id") 
    public Manager user; 
} 

問題がevents各クエリが自動的にディスクリミネータ値(user_type列の値)を取り込むusersテーブルと結合しないことです。例えば

Event.find.where().idEq(100).findUnique(); 

...次のSQLが生成されます

SELECT t0.id c0, t0.name c1, t1.user_type c2, t0.user_id c3 FROM events t0 join users t1 on t1.id = t0.user_id and t1.user_type = 'manager' where t0.id = 100 

なぜusersテーブルに参加しますか? user_typeの値がクエリに既に存在する場合は、その値を取得するのはなぜですか?ユービーはuser_typeuser_typeで見つけています。バグですか?

これを修正するにはどうすればよいですか?

これはかなり壊れて痛みを引き起こします。

編集:主な質問は「これを修正する方法」です。

答えて

0

なぜユーザーを参加させるのですか?

ユーザーは継承階層の一部であるため、ユーザーの識別子は識別子(t1.user_type)ではわかりません。

あなたは、弁別者タイプの列(t1.user_type)とユーザーのID列(t0.user_id)でEbeanが選択されていることがわかります。この場合、Ebeanは適切なタイプの関連ユーザー用の参照Beanを構築できるようにする必要があります。

+0

「user_type」の値がすでにクエリに存在することがわかります。それは "男の名前は何ですか?Rob Brygraveの名前は何ですか?"それは愚かだと思いませんか?さらに、Ebeanは、 'SINGLE_TABLE'継承であるため、すでにIDを知っているユーザーの' user_type'を知る必要はありません。すべてのユーザーは一意のIDを持ちます。さらに、DBからではなく、コードから 'user_type'を得る多くの方法があります。 – chumakoff

関連する問題