Squeryl
定义了一个KeyedEntity
覆盖的特征equals
,检查 if 中的几个条件并super.equals
在最后调用。因为super
is 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
测试都失败了,因为isPersisted
fromKeyedEntity
是假的。
如果混合到一个案例类中,是否有一种设计KeyedEntity
可以保持案例类的平等?我尝试将案例类类型为 P 的自键入和参数化BetterKeyedEntity[K,P] { self: P => ... }
,但它会导致 equals 中的无限递归。
就目前的情况而言,super
被Object
覆盖的 equals in 的最终分支KeyedEntity
将始终返回 false。