1
//$Id: SequenceGenerator.java 9686 2006-03-27 16:47:06Z steve.ebersole@jboss.com $
2
package org.hibernate.id;
4
import java.io.Serializable;
5
import java.sql.PreparedStatement;
6
import java.sql.ResultSet;
7
import java.sql.SQLException;
8
import java.util.Properties;
10
import org.apache.commons.logging.Log;
11
import org.apache.commons.logging.LogFactory;
12
import org.hibernate.HibernateException;
13
import org.hibernate.MappingException;
14
import org.hibernate.exception.JDBCExceptionHelper;
15
import org.hibernate.dialect.Dialect;
16
import org.hibernate.engine.SessionImplementor;
17
import org.hibernate.mapping.Table;
18
import org.hibernate.type.Type;
19
import org.hibernate.util.PropertiesHelper;
24
* Generates <tt>long</tt> values using an oracle-style sequence. A higher
25
* performance algorithm is <tt>SequenceHiLoGenerator</tt>.<br>
27
* Mapping parameters supported: sequence, parameters.
29
* @see SequenceHiLoGenerator
30
* @see TableHiLoGenerator
34
public class SequenceGenerator implements PersistentIdentifierGenerator, Configurable {
37
* The sequence parameter
39
public static final String SEQUENCE = "sequence";
42
* The parameters parameter, appended to the create sequence DDL.
43
* For example (Oracle): <tt>INCREMENT BY 1 START WITH 1 MAXVALUE 100 NOCACHE</tt>.
45
public static final String PARAMETERS = "parameters";
47
private String sequenceName;
48
private String parameters;
49
private Type identifierType;
52
private static final Log log = LogFactory.getLog(SequenceGenerator.class);
54
public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
55
sequenceName = PropertiesHelper.getString(SEQUENCE, params, "hibernate_sequence");
56
parameters = params.getProperty(PARAMETERS);
57
String schemaName = params.getProperty(SCHEMA);
58
String catalogName = params.getProperty(CATALOG);
60
if (sequenceName.indexOf( '.' ) < 0) {
61
sequenceName = Table.qualify( catalogName, schemaName, sequenceName );
64
this.identifierType = type;
65
sql = dialect.getSequenceNextValString(sequenceName);
68
public Serializable generate(SessionImplementor session, Object obj)
69
throws HibernateException {
73
PreparedStatement st = session.getBatcher().prepareSelectStatement(sql);
75
ResultSet rs = st.executeQuery();
78
Serializable result = IdentifierGeneratorFactory.get(
81
if ( log.isDebugEnabled() ) {
82
log.debug("Sequence identifier generated: " + result);
91
session.getBatcher().closeStatement(st);
95
catch (SQLException sqle) {
96
throw JDBCExceptionHelper.convert(
97
session.getFactory().getSQLExceptionConverter(),
99
"could not get next sequence value",
106
public String[] sqlCreateStrings(Dialect dialect) throws HibernateException {
107
String[] ddl = dialect.getCreateSequenceStrings(sequenceName);
108
if ( parameters != null ) {
109
ddl[ddl.length - 1] += ' ' + parameters;
114
public String[] sqlDropStrings(Dialect dialect) throws HibernateException {
115
return dialect.getDropSequenceStrings(sequenceName);
118
public Object generatorKey() {
122
public String getSequenceName() {