2

我能找到的与 KeyedEntity 相关的唯一信息是:

扩展 KeyedEntity[K](其中 K 是数字类型)的对象将为其 id 字段分配新创建的主键值(生成键的机制特定于每个 DatabaseAdaptor)。

当我的键控对象是不可变的时,这如何应用?那么我的对象是不是不可能将其 id 字段分配给新创建的主键值?

我假设我应该在我的对象上覆盖 KeyedEntity 内的抽象 id 方法,以便返回我的对象​​的键。但是,当 Squeryl 写入数据库时​​,它如何找出使用哪个字段作为键呢?

如果重要的话,我正在使用 Squeryl 9.5。我找不到很多关于这些问题的文档。

4

2 回答 2

2

在 0.95 中,Squeryl 将寻找一个字段id,或者在 的情况下CompositeKey,一个名为 的函数id。因此,这些定义中的任何一个都可以工作:

case class MyTable(val id:Long, ...) extends KeyedEntity[Long]

case class MyTable(val field1:Long, val field2:String, ...) extends KeyedEntity[CompositeKey2[Long, String]] {
  def id = compositeKey(field1, field2)
} 

如果您使用单个字段,它会查找名为 的 db 字段id,或者您可以使用@Column注释在 db 中指定备用名称。在 a 的情况下CompositeKey,它将查找与 key 的组成部分相对应的 db 字段(在上面的示例中:field1field2)。您始终可以使用@Column映射到数据库中的不同列名。

正如在另一个答案中提到的,您可以为大多数字段设置别名,但是id在 0.95 中不起作用 - 请参阅:尝试使用 Squeryl 插入时的 ClassCastException。在 0.96 中,事情发生了一些变化,KeyedEntity不再需要,您可以在此处找到更多信息。

如果您对 insert 方法的内部工作原理感到好奇,可以查看github上的源代码Table

于 2013-04-10T14:20:39.410 回答
0

那么我的对象是不是不可能将其 id 字段分配给新创建的主键值?

使用正常的标准方式是不可能的,是的,但这不是正在发生的事情。我们不是在修改对象——我们是在创建新对象。例如,方法 .insert(myEntry) 返回您调用该方法时已插入的对象,而不是您原来的 myEntry。

我假设我应该在我的对象上覆盖 KeyedEntity 内的抽象 id 方法,以便返回我的对象​​的键。

不,您不必这样做 - 您可以将其留空。如果您将表字段命名为与“id”不同的名称 - 不要忘记还包含一个函数,例如def id = myIdField.

但是,当 Squeryl 写入数据库时​​,它如何找出使用哪个字段作为键呢?

它搜索一个具有确切名称的方法——“id”。或者,像我之前写的那样的手动功能。

回答主题标题——例如,KeyedEntity 的一个用例是调用诸如 myEntities.lookup(30L) 之类的方法。或者,能够调用“updateOrInsert”方法。从头开始创建新数据库时自动定义“主键”。和别的...

我找不到很多关于这些问题的文档。

这是查找方法,例如:http ://squeryl.org/selects.html 实际上,我现在写的所有内容都是前段时间从该站点学到的。

于 2013-04-07T16:16:27.760 回答