【发布时间】:2012-09-08 05:24:38
【问题描述】:
Squeryl 定义了一个 trait KeyedEntity 覆盖 equals,检查 if 中的几个条件并在最后调用 super.equals。由于super 是Object,所以它总是会失败。
考虑:
trait T { override def equals(z: Any):Boolean = super.equals(z)} }
case class A(a: Int) extends T
val a = A(1); val b = A(1)
a==b // false
因此,如果你声明
case class Record(id: Long, name: String ...) extends KeyedEntity[Long] { ... }
-- 你创建了几个 Record 实例但不持久化它们,它们的比较会中断。我通过为同一个类同时实现Salat 和Squeryl 后端发现了这一点,然后所有Salat 测试都失败了,因为来自KeyedEntity 的isPersisted 是错误的。
如果KeyedEntity 混合到一个案例类中,是否有一种设计可以保持案例类的平等?我尝试将案例类类型为 P 的自键入和参数化 BetterKeyedEntity[K,P] { self: P => ... },但它会导致 equals 中的无限递归。
就目前的情况而言,super 是 Object,因此 KeyedEntity 中覆盖的 equals 的最终分支将始终返回 false。
【问题讨论】: