While developing a simple application at work I need to specify id field to some other field suppose named 'my_id' and want to use assigned value instead of using default auto_generated. |
I have a table with a column named my_id of type varchar. But GORM by default auto generate an id property with the long type. The solution is straight forward, just call the method id in the mapping closure, with the following param(s): |
package com.pkm class Foo { String my_id static constraints = {} static mapping = { id generator: 'assigned', name: 'my_id' } } |
The generator is the strategy to auto-generate the id, you can use a sequence or something like, since it’s a string the value will be assigned, not generated. The name is the current property to bind the value (my_id in this case). |
We can use our custom class to generate id of entity. For to do this, we need to define a class like below: |
package com.pkm import org.hibernate.HibernateException import org.hibernate.engine.spi.SessionImplementor import org.hibernate.id.IdentifierGenerator class IdGenerator implements IdentifierGenerator { static Map id = [:] @Override Serializable generate(SessionImplementor session, Object o) throws HibernateException { String name = o.class.simpleName if (!id[name]) { id[name] = Table1.executeQuery("select max(id) from ${name}") if (id[name]) id[name] = id[name][0] else id[name] = 0 } return (++id[name]) } } |
And we need to define our class like below: |
package com.pkm class Table1 { Long id String name String roll static mapping = { table("table1") id generator: "com.pkm.IdGenerator", column:"id", unique:"true" } } |
If you want to globally use same configuration then you have to modify Config.groovy, you have to add below entity to Config.groovy |
grails.gorm.default.mapping = { version false id generator:"com.pkm.IdGenerator", column:"id", unique:"true" } |
And finally you can browse for more information |
All generators implement the interface org.hibernate.id.IdentifierGenerator. This is a very simple interface. Some applications can choose to provide their own specialized implementations, however, Hibernate provides a range of built-in implementations. The shortcut names for the built-in generators are as follows: increment generates identifiers of type long, short or int that are unique only when no other process is inserting data into the same table. Do not use in a cluster. identity supports identity columns in DB2, MySQL, MS SQL Server, Sybase and HypersonicSQL. The returned identifier is of type long, short or int. sequence uses a sequence in DB2, PostgreSQL, Oracle, SAP DB, McKoi or a generator in Interbase. The returned identifier is of type long, short or int hilo uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a table and column (by default hibernate_unique_key and next_hi respectively) as a source of hi values. The hi/lo algorithm generates identifiers that are unique only for a particular database. seqhilo uses a hi/lo algorithm to efficiently generate identifiers of type long, short or int, given a named database sequence. uuid uses a 128-bit UUID algorithm to generate identifiers of type string that are unique within a network (the IP address is used). The UUID is encoded as a string of 32 hexadecimal digits in length. guid uses a database-generated GUID string on MS SQL Server and MySQL. native selects identity, sequence or hilo depending upon the capabilities of the underlying database. assigned lets the application assign an identifier to the object before save() is called. This is the default strategy if no element is specified. select retrieves a primary key, assigned by a database trigger, by selecting the row by some unique key and retrieving the primary key value. foreign uses the identifier of another associated object. It is usually used in conjunction with a primary key association. sequence-identity a specialized sequence generation strategy that utilizes a database sequence for the actual value generation, but combines this with JDBC3 getGeneratedKeys to return the generated identifier value as part of the insert statement execution. This strategy is only supported on Oracle 10g drivers targeted for JDK 1.4. Comments on these insert statements are disabled due to a bug in the Oracle drivers. |
Saturday, June 16, 2018
Grails on Groovy > Changing default id name and type from an entity > Custom ID field > Custom ID field value generate algorithm
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment