2013-04-15 13 views
1

我在Play 2框架中使用Ebean。這兩個對我來說都很新。我有兩個型號AlgorithmSolution。 (一個Algorithm可以擁有多個Solution S)如果使用Ebean ManyToOne關係,數據庫表會是什麼樣子?

@Entity 
public class Algorithm extends Model{ 

    @Id 
    public Long id; 

    @Required  
    public String name; 

    public String description; 

    @OneToMany(mappedBy="algorithm", cascade=CascadeType.ALL) 
    public List<Solution> solutions; 

    ... 
} 

而且

@Entity 
public class Solution extends Model { 

    @Id 
    public Long id; 

    @Required 
    public String explanation; 
    public String code; 

    @ManyToOne (cascade=CascadeType.ALL) 
    public Algorithm algorithm; 

    // **** I added it because the error message said algorithm_id is missing!! 
    public Long algorithm_id; 

    ... 
} 

我使用的sqlite3和兩個表的算法和解決方案的架構是:

CREATE TABLE algorithm(id INTEGER primary key, name varchar(255), description varchar(255)); 

而且

CREATE TABLE "solution"(id INTEGER primary key, explanation varchar(255), code varchar(255), algorithm_id INTEGER); 

所以在我的Solution模型中,我原本沒有public Long algorithm_id;這一行。 問題是當我試圖創建一個新的Algorithm實例時,播放框架抱怨我錯過了表solution中的一列algorithm_id。所以我手動在模型定義和數據庫表中添加了algorithm_id,以使錯誤消息消失。但是,似乎ebean的級聯保存並不像預期的那樣工作:algorithm_id列從未被ebean自動填充。它總是空的。換句話說,解決方案實體和算法實體不在數據庫中連接。

所以我的問題是:

  1. 我應該在手動模式和數據庫中添加algorithm_id?如果沒有,如何自動生成algorithm_id?

  2. 我的模型和db表格模式在我的情況下應該是什麼樣子?

謝謝。

+0

你實際上可以讓Ebean生成整個模式。只需創建空數據庫並啓動應用程序。當您在瀏覽器中打開它時,Play會爲您提供執行進化腳本以升級您的數據庫並創建所有缺失的表格。如果你不使用任何遺留的數據庫結構,你可以在模型上工作,Play將同步數據庫結構。 –

+0

@IgorRomanov謝謝,我會嘗試,讓你知道會發生什麼。我禁用了進化,因爲它似乎不適用於sqlite3。請參閱http:// stackoverflow。COM /問題/ 15733941 /錯誤-SQL腳本生成換的SQLite數據庫按ebean合的播放框架。你碰巧知道答案嗎? – ChuanRocks

回答

1

從模型中刪除algorithm_id字段,當您添加public Algorithm algorithm - Ebean應該在數據庫中創建一個名爲algorithm_id的列,但不應該在模型中手動複製它。

當然,如果您已經啓用了ebean插件,如果您正在手動進行更改,請將algorithm_id列添加到您的solution表中。

提示

如果你不能和/或不希望使用其他的數據庫引擎,花了一些時間與一些DB多數民衆贊成由Ebean插件支持 - 爲例MySQL或Postgres的 - 你會能夠通過免費的GUI輕鬆檢查。創建一個用於測試目的的裸露項目,創建幾個不同方向關係的模型,並檢查Ebean如何創建表,列,索引,約束等。請保留此項目以供參考。

+0

謝謝。通過啓用ebean插件,您的意思是在play2中啓用演化?我禁用它,因爲它似乎不適用於sqlite3。請參閱http://stackoverflow.com/questions/15733941/wrong-sql-script-generated-for-sqlite-database-by-ebean-in-the-play-framework如果你可以看看另一個問題,我將不勝感激有一天問道! – ChuanRocks

+0

在這種情況下,您需要學習正確的模式構建。順便說一句,爲什麼SQLite? Play有內置的H2數據庫,至少從我的觀察結果來看,它的速度要快得多(在我的Mac上,sqlite的速度非常慢),Evolution插件的作用就像一個魅力。 – biesior

+0

我使用sqlite的原因是我打算在未來的iOS項目中使用數據庫中的數據。 (我只需要數據庫)Sqlite似乎是iOS平臺的一個很好的嵌入式數據庫。你知道H2是否可以做同樣的工作嗎? – ChuanRocks