2016-12-11 11 views
0

У меня есть 2 модели с помощью "Single Table Inheritance" стратегии:Ebean: Неожиданное поведение с ассоциациями, когда наследование

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

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

У меня также есть Event модель, которая имеет много-к-одному ассоциации с Manager.

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

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

Проблема заключается в том, что каждый запрос к events автоматически делает присоединиться к таблице users для выборки значения дискриминатора (значение user_type столбца).

Например:

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 значение, если оно уже присутствует в запросе? Ebean находит user_type по user_type. Это ошибка?

Как это исправить?

Это много ломается и вызывает большую боль.

Редактировать: Главный вопрос: «Как это исправить?»

ответ

0

Зачем добавлять таблицы пользователей?

Поскольку пользователь является частью иерархии наследования, он не знает «тип» пользователя без значения дискриминатора (t1.user_type).

Вы заметите, что Ebean выбирает столбец типа дискриминатора (t1.user_type) и столбец идентификатора пользователя (t0.user_id). Ebean должен сделать это в этом случае так, чтобы он мог создать ссылочный компонент для соответствующего пользователя с правильным типом.

+0

Как вы видите, значение 'user_type' уже присутствует в запросе. Это как «Как называется имя человека, которого зовут Роб Байгрейв?». Разве вы не думаете, что это глупо? Кроме того, Ebean не нужно знать «user_type» пользователя, если он уже знает его id, так как это наследование SINGLE_TABLE, у всех пользователей есть уникальные идентификаторы. Более того, есть много способов получить 'user_type' из кода, а не из БД. – chumakoff