【问题标题】:Ebean: Unexpected behaviour with associations when inheritanceEbean:继承时关联的意外行为
【发布时间】:2016-12-11 12:37:28
【问题描述】:

我有 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。是bug吗?

如何解决这个问题?

它经常断裂并引起很多痛苦。

编辑:主要问题是“如何解决这个问题?”

【问题讨论】:

    标签: playframework ebean playframework-2.5


    【解决方案1】:

    为什么要加入 users 表?

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

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

    【讨论】:

    • 如您所见,user_type 值已存在于查询中。就像“那个叫 Rob Bygrave 的人叫什么名字?”。你不觉得很傻吗?此外,Ebean 不需要知道用户的user_type,如果它已经知道它的 id,因为它是SINGLE_TABLE 继承,所有用户都有唯一的 id。此外,有很多方法可以从代码中获取user_type,而不是从数据库中获取。
    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多