2013-04-06 22 views
2

我能找到有關KeyedEntity的唯一信息是:延伸KeyedEntity [K],其中K是一個數字型 人員在id字段分配其新創建的主鍵 值(該機制用於產生如何使用Squeryl的KeyedEntity?

對象鍵是特定於每個DatabaseAdaptor的)。

這是如何適用於我的鍵控對象是不可變的?那麼我的對象是不是不可能將它的id字段分配給新創建的主鍵值?

我想我應該重寫我的對象的KeyedEntity內的抽象id方法,以便返回我的對象​​的關鍵。但是,當Squeryl寫入數據庫時​​,Squeryl如何找出哪個字段用作關鍵字?

我正在使用Squeryl 9.5,如果它很重要。我無法找到有關這些問題的大量文檔。

回答

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的數據庫字段,或者您可以使用@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

0

然後是不是不可能的我的對象有一個新創建的主鍵值的id字段分配?

這是不可能的使用正常的標準方式,是的,但這不是發生了什麼。我們不修改對象 - 我們正在創建新對象。例如,方法.insert(myEntry)將返回當您調用該方法時插入的對象,而不是您的原始myEntry。

我假設我應該重寫我的對象上的KeyedEntity中的抽象id方法,以便返回我的對象​​的關鍵。

不,你不必這樣做 - 你可以留空。而且,如果您將表格字段命名爲與「ID」不同的字段 - 請不要忘記也包含一個功能,如def id = myIdField

但是Squeryl在寫入數據庫時​​如何確定哪個字段用作鍵?

它使用確切名稱 - 「id」來搜索方法。或者,像我之前寫的手動功能。

回答主題標題 - 例如,KeyedEntity的一個用例是調用像myEntities.lookup(30L)這樣的方法。或者,可以調用「updateOrInsert」方法。在從頭創建新數據庫時自動定義「主鍵」。和其他人...

我找不到這些問題的文檔。

下面是查找方法,例如:http://squeryl.org/selects.html其實,我現在寫的所有內容都是從前段時間在網站上學到的。

+1

將一個對象插入數據庫後,我檢查它的id字段,它已經改變。例如,像println(thing.id); mytable.insert(事);的println(thing.id);輸出0,然後是248.你是說Squeryl使用反射來找出哪個字段在id函數內被返回? – Mark 2013-04-08 22:04:48

+0

我認爲它創造了一個新的對象,而不是改變舊的,但我不確定。 – VasyaNovikov 2013-04-08 23:44:11