2012-01-13 12 views
12

miei Grails 2.0 app ha un oggetto di dominio definito dall'utente:La modifica primaria id chiave per tipo String in Grails

class User { 

static mapping = { 
    table "dt_user" 
    columns { 
     id column:'user_id', generator:'assigned', type:'string' 
    } 
} 

Quando si tenta di salvare un nuovo utente nel mio file di avvio in questo modo:

def user = new User(id: "smith").save(failOnError:true) 

ottengo il seguente errore:

| Error 2012-01-13 10:09:42,659 [main] ERROR property.BasicPropertyAccessor - IllegalArgumentException in class: User, setter method of property: id 
| Error 2012-01-13 10:09:42,660 [main] ERROR property.BasicPropertyAccessor - expected type: java.lang.Long, actual value: java.lang.String 

ho anche provato a cambiare la classe utente a questo:

class User { 
    static mapping = { 
     table "dt_user" 
     columns { 
      id column:'user_id', generator:'assigned', type:'string', name:'id' 
     } 
    } 

    String id 
} 

che ha reso gli errori di cui sopra andare via. Tuttavia ho scoperto che questo ha comportato la generazione automatica degli ID, ignorando completamente la clausola generator: 'assigned'.

Cosa sto facendo di sbagliato qui?

risposta

17

Sembra che avvolgerlo nel blocco columns sia il colpevole. Questo potrebbe essere stato richiesto ad un certo punto (prima del mio tempo) ma è stato facoltativo finchè ho usato Grails e apparentemente ora è rotto. Ma si può semplicemente dichiarare mappature delle colonne direttamente:

class User { 

    String id 

    static mapping = { 
     table "dt_user" 
     id column: 'user_id', generator: 'assigned' 
    } 
} 

Fino a quando il campo è dichiarato come String ed è configurato come assigned funzionerà; non c'è bisogno di dire a GORM che è una stringa, può capirlo.

Problemi correlati