: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_type
をuser_type
で見つけています。バグですか?
これを修正するにはどうすればよいですか?
これはかなり壊れて痛みを引き起こします。
編集:主な質問は「これを修正する方法」です。
「user_type」の値がすでにクエリに存在することがわかります。それは "男の名前は何ですか?Rob Brygraveの名前は何ですか?"それは愚かだと思いませんか?さらに、Ebeanは、 'SINGLE_TABLE'継承であるため、すでにIDを知っているユーザーの' user_type'を知る必要はありません。すべてのユーザーは一意のIDを持ちます。さらに、DBからではなく、コードから 'user_type'を得る多くの方法があります。 – chumakoff