У меня есть 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
. Это ошибка?
Как это исправить?
Это много ломается и вызывает большую боль.
Редактировать: Главный вопрос: «Как это исправить?»
Как вы видите, значение 'user_type' уже присутствует в запросе. Это как «Как называется имя человека, которого зовут Роб Байгрейв?». Разве вы не думаете, что это глупо? Кроме того, Ebean не нужно знать «user_type» пользователя, если он уже знает его id, так как это наследование SINGLE_TABLE, у всех пользователей есть уникальные идентификаторы. Более того, есть много способов получить 'user_type' из кода, а не из БД. – chumakoff