Hello,
*Use case:*
I need a strict, no-gaped sequential id-column for sequential numbering
invoices.
*Problem:*
I could not make it together with MySQL out-of-the-box (OpenJPA 2.2.0) -
neither with AUTO, IDENTITY, SEQUENCE nor TABLE strategy.
*My approach:*
Extending the dictionary to make use of MySQL's AUTO_INCREMENT feature and
accessing its system table to read from there.
*Implementation:*
package my.package.;
import org.apache.openjpa.jdbc.schema.Sequence;
import org.apache.openjpa.jdbc.sql.MySQLDictionary;
public class CKMySQLDictionary extends MySQLDictionary
{
public CKMySQLDictionary()
{
super();
this.nextSequenceQuery = "SELECT `auto_increment` FROM
`information_schema`.`tables` WHERE `table_name`=\"{0}\"";
}
@Override
public String[] getCreateSequenceSQL(Sequence seq)
{
StringBuffer buffer = new StringBuffer();
buffer.append("ALTER TABLE `" + seq.getFullIdentifier() + "`
AUTO_INCREMENT=" + seq.getInitialValue()
+ ", CHANGE `id` `id` BIGINT( 20 ) NOT NULL
AUTO_INCREMENT");
return new String[] { buffer.toString() };
}
}
*Configuration:*
<property name="databasePlatform" value="my.package.CKMySQLDictionary" />
*Now here's the issue:*
As you can see, the next sequence query has a placeholder '{0}' -- which
will later be replaced by the value of the @SequenceGenerator's attribute
value of 'sequenceName'.
I additionally need a second placeholder '{1}' to differenciate between
schemas, as the 'table_name' could be equal among different schemas -- such
that I could use e.g.:
this.nextSequenceQuery = "SELECT `auto_increment` FROM
`information_schema`.`tables` WHERE `table_name`=\"{0}\" AND *
`table_schema`=\"{1}\"*";
*Any suggestions?*
*
*
Best regards,
Daniel