You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by jo...@apache.org on 2013/12/19 18:18:24 UTC
svn commit: r1552362 - in /cayenne/main/trunk:
cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java
docs/doc/src/main/resources/RELEASE-NOTES.txt
Author: johnthuss
Date: Thu Dec 19 17:18:23 2013
New Revision: 1552362
URL: http://svn.apache.org/r1552362
Log:
CAY-1894 Support native PK generation using sequences for H2 databases
Added:
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java
Modified:
cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
Modified: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java?rev=1552362&r1=1552361&r2=1552362&view=diff
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java (original)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2Adapter.java Thu Dec 19 17:18:23 2013
@@ -26,12 +26,24 @@ import org.apache.cayenne.access.types.E
import org.apache.cayenne.configuration.Constants;
import org.apache.cayenne.configuration.RuntimeProperties;
import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.PkGenerator;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DbAttribute;
import org.apache.cayenne.merge.MergerFactory;
import org.apache.cayenne.resource.ResourceLocator;
/**
+ * DbAdapter implementation for <a href="http://www.h2database.com/">H2
+ * RDBMS </a>. Sample connection settings to use with H2 are shown
+ * below:
+ *
+ * <pre>
+ * postgres.jdbc.username = sa
+ * postgres.jdbc.password =
+ * postgres.jdbc.url = jdbc:h2:cayenne
+ * postgres.jdbc.driver = org.h2.Driver
+ * </pre>
+ *
* @since 3.0
*/
public class H2Adapter extends JdbcAdapter {
@@ -57,4 +69,9 @@ public class H2Adapter extends JdbcAdapt
sqlBuffer.append(" AUTO_INCREMENT");
}
}
+
+ @Override
+ protected PkGenerator createPkGenerator() {
+ return new H2PkGenerator(this);
+ }
}
Added: cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java?rev=1552362&view=auto
==============================================================================
--- cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java (added)
+++ cayenne/main/trunk/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2PkGenerator.java Thu Dec 19 17:18:23 2013
@@ -0,0 +1,124 @@
+/*****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.dba.h2;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.dba.JdbcAdapter;
+import org.apache.cayenne.dba.oracle.OraclePkGenerator;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbKeyGenerator;
+
+/**
+ * Default PK generator for H2 that uses sequences for PK generation.
+ *
+ * @since 3.2
+ */
+public class H2PkGenerator extends OraclePkGenerator {
+
+ protected H2PkGenerator(JdbcAdapter adapter) {
+ super(adapter);
+ }
+
+ @Override
+ protected String createSequenceString(DbEntity ent) {
+ StringBuilder buf = new StringBuilder();
+ buf.append("CREATE SEQUENCE ").append(sequenceName(ent)).append(" START WITH 200")
+ .append(" INCREMENT BY ").append(pkCacheSize(ent)).append(" CACHE 1");
+ return buf.toString();
+ }
+
+ @Override
+ protected long longPkFromDatabase(DataNode node, DbEntity entity) throws Exception {
+
+ DbKeyGenerator pkGenerator = entity.getPrimaryKeyGenerator();
+ String pkGeneratingSequenceName;
+ if (pkGenerator != null && DbKeyGenerator.ORACLE_TYPE.equals(pkGenerator.getGeneratorType())
+ && pkGenerator.getGeneratorName() != null)
+ pkGeneratingSequenceName = pkGenerator.getGeneratorName();
+ else
+ pkGeneratingSequenceName = sequenceName(entity);
+
+ Connection con = node.getDataSource().getConnection();
+ try {
+ Statement st = con.createStatement();
+ try {
+ String sql = "SELECT NEXT VALUE FOR " + pkGeneratingSequenceName;
+ adapter.getJdbcEventLogger().logQuery(sql, Collections.EMPTY_LIST);
+ ResultSet rs = st.executeQuery(sql);
+ try {
+ // Object pk = null;
+ if (!rs.next()) {
+ throw new CayenneRuntimeException("Error generating pk for DbEntity " + entity.getName());
+ }
+ return rs.getLong(1);
+ } finally {
+ rs.close();
+ }
+ } finally {
+ st.close();
+ }
+ } finally {
+ con.close();
+ }
+
+ }
+
+ /**
+ * Fetches a list of existing sequences that might match Cayenne generated
+ * ones.
+ */
+ @Override
+ protected List<String> getExistingSequences(DataNode node) throws SQLException {
+
+ // check existing sequences
+ Connection con = node.getDataSource().getConnection();
+
+ try {
+ Statement sel = con.createStatement();
+ try {
+ String sql = "SELECT LOWER(sequence_name) FROM Information_Schema.Sequences";
+ adapter.getJdbcEventLogger().logQuery(sql, Collections.EMPTY_LIST);
+ ResultSet rs = sel.executeQuery(sql);
+ try {
+ List<String> sequenceList = new ArrayList<String>();
+ while (rs.next()) {
+ sequenceList.add(rs.getString(1));
+ }
+ return sequenceList;
+ } finally {
+ rs.close();
+ }
+ } finally {
+ sel.close();
+ }
+ } finally {
+ con.close();
+ }
+ }
+}
Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=1552362&r1=1552361&r2=1552362&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Thu Dec 19 17:18:23 2013
@@ -29,6 +29,7 @@ CAY-1882 Porting to OSGi environment
CAY-1883 Clean up Cayenne maven structure
CAY-1886 cayenne-di module reorg, new exceptions
CAY-1890 Remove Cayenne-level buffering when retrieving LOBs
+CAY-1894 Support native PK generation using sequences for H2 databases
Bug Fixes: