2012-12-25 60 views
4

我剛開始使用Play Framework。在完成教程(涵蓋基本功能)後,我嘗試在數據庫和播放之間建立連接。我的一個關係具有架構:ebean中的複合鍵和播放框架

CREATE TABLE IF NOT EXISTS `shop`.`CatPath` (
    `parentC` INT NOT NULL , 
    `childC` INT NOT NULL , 
    `depth` INT NOT NULL , 
    PRIMARY KEY (`parentC`, `childC`) 
) 

所以我建立模型類:

@Entity 
public class CatPath extends Model { 

@EmbeddedId 
public CatPathKey key; 
public Long depth; 

public class CatPathKey { 

     public Long parentC; 
     public Long childC; 
} 

public static Finder<CatPathKey, CatPath> find = new Finder<CatPathKey, CatPath>(CatPathKey.class, CatPath.class); 

編譯後,我得到異常:

PersistenceException: Could not find BeanDescriptor for class models.CatPath$KatPathKey. Perhaps the EmbeddedId class is not registered? 

我不知道哪裏出了問題,當我遵循教程一切工作。我的代碼和教程之間的唯一區別是關鍵:我有複合鍵,在教程中只有一列是關鍵。爲什麼在教程「註冊課程」中沒有必要?我猜,它是自動註冊的,但爲什麼現在用複合鍵,它不是?

我試圖找到一些信息,我發現:http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Ids/EmbeddedId 這個XML代碼是'類註冊'?在Play框架教程和詳細的主題xml沒有提到,我沒有做任何與我的模型的類和一切工作。

回答

6

你有你的CatPathKey類下添加@Embeddable註釋:

@Embeddable 
public class CatPathKey { 

     public Long parentC; 
     public Long childC; 
} 
+0

謝謝,現在的作品完美。你能解釋爲什麼我沒有得到單一主鍵的例外嗎? –

+0

ebean使用'@ Embeddable'註釋來註冊您的課程。如果您使用單個主鍵,它將起作用,因爲包含類已使用'@ Entity'註釋進行了註冊。 –

+0

Embeddable類中可能有兩個ManyToOne字段嗎?我需要一個組合鍵來確保我只有引用其他兩個條目的唯一數據庫條目。 – cosmolev