diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseAnywhereMaxValueIncrementer.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseAnywhereMaxValueIncrementer.java new file mode 100644 index 0000000000000000000000000000000000000000..39fe19db11c99328bc6ee05f4554b9a1501d027e --- /dev/null +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseAnywhereMaxValueIncrementer.java @@ -0,0 +1,66 @@ +package org.springframework.jdbc.support.incrementer; + +import javax.sql.DataSource; + +/** + * {@link org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer} that increments + * the maximum value of a given Sybase SQL Anywhere table + * with the equivalent of an auto-increment column. Note: If you use this class, your table key + * column should NOT be defined as an IDENTITY column, as the sequence table does the job. + * + *

This class is intended to be used with Sybase Anywhere. + * + *

The sequence is kept in a table. There should be one sequence table per + * table that needs an auto-generated key. + * + *

Example: + * + *

 create table tab (id int not null primary key, text varchar(100))
+ * create table tab_sequence (id bigint identity)
+ * insert into tab_sequence values(DEFAULT)
+ * + * If "cacheSize" is set, the intermediate values are served without querying the + * database. If the server or your application is stopped or crashes or a transaction + * is rolled back, the unused values will never be served. The maximum hole size in + * numbering is consequently the value of cacheSize. + * + * HINT: Since Sybase Anywhere supports the JDBC 3.0 getGeneratedKeys method, + * it is recommended to use IDENTITY columns directly in the tables and then using a + * {@link org.springframework.jdbc.core.simple.SimpleJdbcInsert} or utilizing + * a {@link org.springframework.jdbc.support.KeyHolder} when calling the with the + * update(PreparedStatementCreator psc, KeyHolder generatedKeyHolder) + * method of the {@link org.springframework.jdbc.core.JdbcTemplate}. + * + *

Thanks to Tarald Saxi Stormark for the suggestion! + * + * @author Thomas Risberg + * @since 3.0.5 + */ +public class SybaseAnywhereMaxValueIncrementer extends SybaseMaxValueIncrementer { + + /** + * Default constructor for bean property style usage. + * @see #setDataSource + * @see #setIncrementerName + * @see #setColumnName + */ + public SybaseAnywhereMaxValueIncrementer() { + } + + /** + * Convenience constructor. + * @param dataSource the DataSource to use + * @param incrementerName the name of the sequence/table to use + * @param columnName the name of the column in the sequence table to use + */ + public SybaseAnywhereMaxValueIncrementer(DataSource dataSource, String incrementerName, String columnName) { + super(dataSource, incrementerName, columnName); + } + + + @Override + protected String getIncrementStatement() { + return "insert into " + getIncrementerName() + " values(DEFAULT)"; + } + +} diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.java index 7cff7184f76255900234e4c256182c7b2932f37a..9545a528fbaa278108a672d31179de419bf97bc0 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/incrementer/SybaseMaxValueIncrementer.java @@ -12,11 +12,12 @@ import java.sql.ResultSet; import java.sql.SQLException; /** - * {@link org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer} that increments the maximum value of a given SQL Server table - * with the equivalent of an auto-increment column. Note: If you use this class, your Derby key + * {@link org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer} that increments + * the maximum value of a given Sybase SQL Server table + * with the equivalent of an auto-increment column. Note: If you use this class, your table key * column should NOT be defined as an IDENTITY column, as the sequence table does the job. * - *

This class is inteded to be used with Sybase Adaptive Server. + *

This class is intended to be used with Sybase Adaptive Server. * *

The sequence is kept in a table. There should be one sequence table per * table that needs an auto-generated key. @@ -89,7 +90,7 @@ public class SybaseMaxValueIncrementer extends AbstractColumnMaxValueIncrementer this.valueCache = new long[getCacheSize()]; this.nextValueIndex = 0; for (int i = 0; i < getCacheSize(); i++) { - stmt.executeUpdate("insert into " + getIncrementerName() + " values()"); + stmt.executeUpdate(getIncrementStatement()); ResultSet rs = stmt.executeQuery("select @@identity"); try { if (!rs.next()) { @@ -115,4 +116,12 @@ public class SybaseMaxValueIncrementer extends AbstractColumnMaxValueIncrementer return this.valueCache[this.nextValueIndex++]; } + /** + * Statement to use to increment the "sequence" value. Can be overridden by sub-classes. + * @return The SQL statement to use + */ + protected String getIncrementStatement() { + return "insert into " + getIncrementerName() + " values()"; + } + }