7

Ho una chiave composta di ID utente e ruolo utente nel mio DB.Instradamento sul modello EDIT predefinito con chiave composita in riproduzione 1.2.4

Per mappare il DB con il modello, sotto è il codice:

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

Attualmente sono in grado di visualizzare l'elenco degli utenti e anche in grado di aggiungere nuovi utenti per la mia applicazione. Ma quando provo a instradare il modello "Modifica" predefinito facendo clic su un ID utente, ricevo un errore: "Nessun percorso".

Inoltre, posso vedere che al clic di un utente, l'ID composito non viene inviato come URL, infatti alcuni oggetti vengono aggiunti alla fine dell'URL (che potrebbe essere una ragione per questo).

Gentilmente fammi sapere come visualizzare la schermata di modifica predefinita quando nel DB è presente una chiave composita. Ho lottato con questo problema dal momento che un po 'di tempo, ma non ho avuto alcun materiale di riferimento nella documentazione :(

+0

L'oggetto che viene aggiunto alla fine dell'URL come indicato dall'OP apparentemente viene generato dal metodo toString predefinito. Presumo che questo debba essere ignorato; tuttavia non so come fare in modo tale che il modello sottostante corretto verrà modificato. –

+0

Puoi mostrare il codice che stai utilizzando per generare l'URL? – Magnus

risposta

2

Il controller di gioco CRUD non funziona bene con le chiavi composte. Ecco come si può lavorare intorno ad esso.

in primo luogo, decidere su un formato in stringa per le chiavi composte - nell'esempio qui sotto ho appena preso i due tasti (SSN, accountID) e concatenati li separava con un "-".

nel modello ignorare il _key e i metodi findById da GenericModel e JPABase come segue:

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

Avanti l'override del metodo show nel controller:

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

Questo è tutto.

+0

sei genio! –

+0

@DidarBurmaganov, potresti scherzare! – Nurlan

+0

e riguardo l'editing? – Nurlan

Problemi correlati