2010-11-23 18 views
5

Quiero cambiar mis clases de dominio para usar un UUID de longitud variable para sus ID. No quiero simplemente mostrar identificadores secuenciales en la URL para que la gente intente meterse con ellos. Escribí una versión personalizada del método UUID de Java para permitir la longitud variable, así puedo tener identificadores más cortos para modelos que no crecerán grandes.¿Cuál es la mejor manera de definir la generación personalizada de identificadores como predeterminada en Grails?

Encontré este hilo que explicaba cómo modificar la asignación predeterminada para poder cambiar a 'asignado'. Modify Id generation for a Grails Plugin

¿Cuál es la mejor manera de configurar también un predeterminado beforeInsert (para generar el UUID personalizado) y decirle a Grails que quiero usar cadenas para identificadores en lugar de enteros?

Intenté agregar grails.gorm.default.beforeInsert a la configuración pero eso no funcionó.

+2

de ataylor a continuación es la forma correcta de hacerlo en griales, pero normalmente he dejado la base de datos genera identificadores sola y ha añadido un campo diferente cadena/GUID de los objetos que necesitan algún tipo de ID de correlación que podría exponerse al usuario final. De esta manera, obtienes el comportamiento normal de combinación/clave externa que grails/hibernate y se han ajustado las bases de datos (y escribir SQL es más fácil), pero cuando necesitas esa ID externa, también la tienes. –

+0

Eso es lo que he hecho antes, pero he leído que se pierde en la memoria caché predeterminada de esa manera, ya que lo hace mediante la identificación. Y como trato de no hacer cosas contra el DB (o tenemos una tecla alternativa) voy a dar una oportunidad. – ahanson

Respuesta

7

Para que Grails use cadenas para los identificadores, solo declare una propiedad String id. Para poblarlo con un UUID personalizado, usaría un generador de identificador de hibernación en lugar de beforeInsert. Crear una clase que se extiende org.hibernate.id.IdentifierGenerator, a continuación, agregar una asignación de Identificación del generador de esta manera a su clase de dominio:

class MyIdGenerator extends IdentifierGenerator { 
    Serializable generate(SessionImplementor session, Object object) { 
     return MyUUID.generate() 
    } 
} 

class MyDomain { 
    String id 
    static mapping = { 
     id generator:"my.package.MyIdGenerator", column:"id", unique:"true" 
    } 
} 
1

Esta pregunta es viejo pero sigue apareciendo en las búsquedas. Esta es actualmente la mejor manera de hacerlo, alrededor de Grails 2.3. (Estoy usando postgres, así que observe el tipo "pg-uuid". Adapte esto a su almacén de datos en particular). respuesta

UUID uuid  
static mapping = { 
    uuid generator: 'uuid2', type: 'pg-uuid' 
    ... 
} 
+0

Obras confirmadas en griales 2.5.4 –

Cuestiones relacionadas