7

私のDBにUser IdとUser Roleの複合キーがあります。 crudのコンポジットキーを使用したデフォルトのEDITテンプレートへのルーティングPlay 1.2.4

@Id 
@Column(name="ID") 
public int userId; 
@Id 
    @Column(name="USER_ROLE") 
public String userRole; 
...... 
    ...... 
    @Override 
public String toString() {  
    return userId; 
} 

は現在、私は自分のアプリケーションのための新しいユーザーを追加することも、ユーザーのリストを表示することができそして午前:

は、モデルとDBをマッピングするために、以下のコードです。しかし、ユーザーIDをクリックしてデフォルトの「編集」テンプレートにルーティングしようとすると、「ルートがありません」というエラーが表示されます。

また、ユーザーのクリックで、コンポジットIDがURLとして送信されないことがわかります。実際には、URLの末尾にオブジェクトが追加されています(理由が考えられます)。

DBにコンポジットキーがあるときにデフォルトの編集画面を表示する方法を教えてください。私はかなりの時間があるため、この問題で苦労されているが、ドキュメント内の任意の参考資料を得ませんでした:(

+0

OPで言及されたURLの末尾に追加されるオブジェクトは、明らかにデフォルトのtoStringメソッドによって生成されます。私はこれを無効にする必要があると推測します。しかし私は正しい基礎モデルが編集されるようにする方法を知らない。 –

+0

URLの生成に使用しているコードを表示できますか? – Magnus

答えて

2

プレイCRUDコントローラが複合キーでうまく動作しません。ここでは、それを回避することができる方法です。

まず、あなたの複合キーの文字列化された形式を決定 - の例では、私はちょうど2つのキー(SSN、accountIdを)を取り、それらを分離して連結してきたの下に「 - 」。

モデルで_keyを上書きGenericModelおよびJPABaseのfindByIdメソッドを次のように使用します。

package controllers; 

    import models.Part; 

    public class Parts extends CRUD { 

    /** 
    * CRUD show method doesn't know how to handle composite ids. 
    * 
    * @param id composite of ssn + "-" + accountId 
    * @throws Exception 
    */ 
    public static void show(String id) throws Exception { 
     // Do not rename 'type' or 'object' 
     ObjectType type = ObjectType.get(getControllerClass()); 
     notFoundIfNull(type); 
     Part object = Part.findById(id); 
     notFoundIfNull(object); 
     render("CRUD/show.html", type, object); 
    } 
} 

それだ:

package models; 

import play.db.jpa.GenericModel; 

import javax.persistence.Entity; 
import javax.persistence.Id;  

@Entity 
public class Part extends GenericModel { 
    @Id 
    public int ssn; 
    @Id 
    public int accountId; 
    public String name; 

    /** 
    * Find a part by its composite id ("ssn-accountId") 
    */ 
    public static Part findById(String id) { 
     // Split the composite id to extract ssn and accountId 
     String[] elements = id.split("-"); 
     int ssn = Integer.valueOf(elements[0]); 
     int accountId = Integer.valueOf(elements[1]); 

     return Part.find("ssn=? AND accountId=?", ssn, accountId).first(); 
    } 

    /** 
    * Return a composite id ("ssn-accountId") 
    */ 
    public String _key() { 
     return ssn + "-" + accountId; 
    } 
} 

次はあなたのコントローラでshowメソッドをオーバーライドします。

+0

あなたは元気です! –

+0

@DidarBurmaganov、あなたは冗談かもしれない! – Nurlan

+0

編集はどうですか? – Nurlan

関連する問題