我有2个模型使用"单表继承"策略:
@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 :(得分:0)
为什么要加入用户表?
由于用户是继承层次结构的一部分,因此不知道没有鉴别器值(t1.user_type
)的用户的“类型”。
您会注意到Ebean正在选择鉴别器类型列(t1.user_type
)和用户的id列(t0.user_id
)。在这种情况下,Ebean需要这样做,以便它可以为具有正确类型的关联用户构建一个引用bean。