1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.hibernate.id.factory;
25
26 import java.util.Properties;
27 import java.io.Serializable;
28 import java.util.concurrent.ConcurrentHashMap;
29
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 import org.hibernate.id.IdentifierGenerator;
34 import org.hibernate.id.UUIDGenerator;
35 import org.hibernate.id.UUIDHexGenerator;
36 import org.hibernate.id.TableHiLoGenerator;
37 import org.hibernate.id.Assigned;
38 import org.hibernate.id.IdentityGenerator;
39 import org.hibernate.id.SelectGenerator;
40 import org.hibernate.id.SequenceGenerator;
41 import org.hibernate.id.SequenceHiLoGenerator;
42 import org.hibernate.id.IncrementGenerator;
43 import org.hibernate.id.ForeignGenerator;
44 import org.hibernate.id.GUIDGenerator;
45 import org.hibernate.id.SequenceIdentityGenerator;
46 import org.hibernate.id.Configurable;
47 import org.hibernate.id.enhanced.SequenceStyleGenerator;
48 import org.hibernate.id.enhanced.TableGenerator;
49 import org.hibernate.type.Type;
50 import org.hibernate.util.ReflectHelper;
51 import org.hibernate.dialect.Dialect;
52 import org.hibernate.MappingException;
53
54
55
56
57
58
59 public class DefaultIdentifierGeneratorFactory implements IdentifierGeneratorFactory, Serializable {
60 private static final Logger log = LoggerFactory.getLogger( DefaultIdentifierGeneratorFactory.class );
61
62 private transient Dialect dialect;
63 private ConcurrentHashMap<String, Class> generatorStrategyToClassNameMap = new ConcurrentHashMap<String, Class>();
64
65
66
67
68 public DefaultIdentifierGeneratorFactory() {
69 register( "uuid2", UUIDGenerator.class );
70 register( "guid", GUIDGenerator.class );
71 register( "uuid", UUIDHexGenerator.class );
72 register( "uuid.hex", UUIDHexGenerator.class );
73 register( "hilo", TableHiLoGenerator.class );
74 register( "assigned", Assigned.class );
75 register( "identity", IdentityGenerator.class );
76 register( "select", SelectGenerator.class );
77 register( "sequence", SequenceGenerator.class );
78 register( "seqhilo", SequenceHiLoGenerator.class );
79 register( "increment", IncrementGenerator.class );
80 register( "foreign", ForeignGenerator.class );
81 register( "sequence-identity", SequenceIdentityGenerator.class );
82 register( "enhanced-sequence", SequenceStyleGenerator.class );
83 register( "enhanced-table", TableGenerator.class );
84 }
85
86
87
88
89 public void setDialect(Dialect dialect) {
90 log.debug( "Setting dialect [" + dialect + "]" );
91 this.dialect = dialect;
92 }
93
94 public void register(String strategy, Class generatorClass) {
95 String msg = "Registering IdentifierGenerator strategy [" + strategy + "] -> [" + generatorClass + "]";
96 Object old = generatorStrategyToClassNameMap.put( strategy, generatorClass );
97 if ( old != null ) {
98 msg += ", overriding [" + old + "]";
99 }
100 log.debug( msg );
101 }
102
103
104
105
106 public IdentifierGenerator createIdentifierGenerator(String strategy, Type type, Properties config) {
107 try {
108 Class clazz = getIdentifierGeneratorClass( strategy );
109 IdentifierGenerator idgen = ( IdentifierGenerator ) clazz.newInstance();
110 if ( idgen instanceof Configurable ) {
111 ( ( Configurable ) idgen ).configure( type, config, dialect );
112 }
113 return idgen;
114 }
115 catch ( Exception e ) {
116 String msg = "Could not instantiate id generator [entity-name="
117 + config.get( IdentifierGenerator.ENTITY_NAME ) + "]";
118 throw new MappingException( msg, e );
119 }
120 }
121
122
123
124
125 public Class getIdentifierGeneratorClass(String strategy) {
126 if ( "native".equals( strategy ) ) {
127 return dialect.getNativeIdentifierGeneratorClass();
128 }
129
130 Class generatorClass = generatorStrategyToClassNameMap.get( strategy );
131 try {
132 if ( generatorClass == null ) {
133 generatorClass = ReflectHelper.classForName( strategy );
134 }
135 }
136 catch ( ClassNotFoundException e ) {
137 throw new MappingException( "Could not interpret id generator strategy [" + strategy + "]" );
138 }
139 return generatorClass;
140 }
141 }