我能找到的与KeyedEntity相关的唯一信息是:
扩展KeyedEntity [K]的对象,其中K是数字类型 将为其id字段分配新创建的主键 value(生成密钥的机制特定于每个DatabaseAdaptor)。
当我的键控对象不可变时,这是如何应用的?那么我的对象不能将其id字段分配给新创建的主键值吗?
我假设我应该在我的对象上覆盖KeyedEntity中的抽象id方法,以便返回我的对象的键。但Squeryl如何在写入数据库时找出哪个字段用作密钥?
如果重要,我正在使用Squeryl 9.5。我找不到关于这些问题的大量文件。
答案 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字段(在上面的示例中:field1
和field2
)。您始终可以使用@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实际上,我现在写的所有内容都是我从网站上学到的。