2013-06-12 17 views
7

Ich habe einen zusammengesetzten Schlüssel der Benutzer-ID und Benutzerrolle in meiner DB.Routing auf Standard EDIT-Vorlage mit Composite-Key in Crud Play 1.2.4

Für die Abbildung der DB mit dem Modell ist unter dem Code:

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

Derzeit ich bin in der Lage, die Liste der Benutzer angezeigt werden und auch in der Lage neue Benutzer für meine Anwendung hinzufügen. Aber wenn ich versuche, auf die Standardvorlage "Bearbeiten" zu routen, indem ich auf eine Benutzer-ID klicke, erhalte ich einen Fehler: "Keine Route".

Auch kann ich sehen, dass beim Klicken eines Benutzers die Composite-ID nicht als URL gesendet wird, tatsächlich wird ein Objekt am Ende der URL angehängt (was ein Grund dafür sein könnte).

Bitte lassen Sie mich wissen, wie Sie den Standard-Bearbeitungsbildschirm anzeigen, wenn wir einen zusammengesetzten Schlüssel in der DB haben. Ich habe seit geraumer Zeit mit diesem Problem zu kämpfen, aber konnte keine Referenzmaterialien in der Dokumentation bekam :(

+0

Das Objekt, das an das Ende der URL angehängt wird, wie vom OP erwähnt, wird anscheinend von der standardmäßigen toString-Methode generiert. Ich nehme an, dass dies außer Kraft gesetzt werden muss; Ich weiß jedoch nicht, wie dies zu tun ist, damit das korrekte zugrunde liegende Modell bearbeitet wird. –

+0

Können Sie den Code anzeigen, den Sie zum Generieren der URL verwenden? – Magnus

Antwort

2

Die Play CRUD-Controller nicht gut mit Composite-Schlüssel funktionieren. Hier ist, wie man es umgehen.

Zuerst entscheidet auf ein Zeichenfolgeformat für Ihren zusammengesetzten Schlüssel - im Beispiel unten ich die beiden Tasten nur genommen habe (SSN, accountId) und verketteten sie mit einem getrennt „-“.

in Ihrem Modell überschreibt die _key und findById Methoden von GenericModel und JPABase wie folgt:

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; 
    } 
} 

nächste die show Methode in dem Controller außer Kraft setzen:

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); 
    } 
} 

Das ist es.

+0

Sie sind genial! –

+0

@DidarBurmaganov, Sie könnten Witze machen! – Nurlan

+0

was ist mit dem Bearbeiten? – Nurlan