我如何使用Squeryl的KeyedEntity?

时间:2013-04-06 05:21:18

标签: scala squeryl

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

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

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

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

如果重要,我正在使用Squeryl 9.5。我找不到关于这些问题的大量文件。

2 个答案:

答案 0 :(得分: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)
} 

如果您使用单个字段,它将查找名为id的db字段,或者您可以使用@Column注释在db中指定备用名称。在CompositeKey的情况下,它将查找与密钥组成对应的db字段(在上面的示例中:field1field2)。您始终可以使用@Column映射到db中的其他列名称。

正如在其他答案中提到的,您可以为大多数字段添加别名,但是id在0.95中不起作用 - 请参阅:ClassCastException when trying to insert with Squeryl。在0.96项内容会有所变化,因为不再需要KeyedEntity,您可以在here找到更多信息。

如果您对插入方法的内部结构如何工作感到好奇,可以查看source of Table on github

答案 1 :(得分:0)

  

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

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

  

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

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

  

但Squeryl如何在写入数据库时​​找出哪个字段用作关键字?

它使用确切的名称 - “id”来传递一个方法。或者,像我之前写的手动功能。

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

  

我找不到关于这些问题的大量文件。

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