Ebean:继承

时间:2016-12-11 12:37:29

标签: playframework ebean playframework-2.5

我有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。这是一个错误吗?

如何解决这个问题?

它打破了很多并导致很多痛苦。

编辑:主要问题是"如何解决此问题?"

1 个答案:

答案 0 :(得分:0)

  

为什么要加入用户表?

由于用户是继承层次结构的一部分,因此不知道没有鉴别器值(t1.user_type)的用户的“类型”。

您会注意到Ebean正在选择鉴别器类型列(t1.user_type)和用户的id列(t0.user_id)。在这种情况下,Ebean需要这样做,以便它可以为具有正确类型的关联用户构建一个引用bean。