db-torque-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Thomas Fischer <fisc...@seitenbau.net>
Subject Re: [PATCH] Torque with hsqldb and referenced identity columns
Date Fri, 25 Nov 2005 09:07:35 GMT




Would you mind to open an issue in scarab on that ?

http://issues.apache.org/scarab/issues/

Patches tend to get lost at the list...

    Thanks in advance,

        Thomas

patrick.carl@web.de schrieb am 23.11.2005 07:20:12:

> Hi,
>
> my submitted patch broke the generated sql for hypersonic. After I was
> able to run the test project I found it out.
>
> But I was able to get it to work again, here's the patch description:
>
> Using hsqldb with id-method native columns creates columns defined with
> the constraint "IDENTITY". This generated an index starting with 0. As
> Torque regards objects with an primary key 0 as not initialized, this
> can lead to problems when using relationships between tables. To prevent
> this I've patched the generated string from "IDENTITY" to "GENERATED BY
> DEFAULT AS IDENTITY (STARTING WITH 0)". This broke the created SQL for
> hsqldb tables since Torque preprends the String "NOT NULL" in front of
> the identity string. hsqldb does not allow this. To change this I've
> patched the interface org.apache.torque.engine.platform.Platform and
> added a method "public getNullString(Column col)" since the
> PlatformHypersonicImpl needed to know if the column is a not null and if
> the column uses the native id-method. The default implementation of
> Platform delegates the call of this method to the former existing one.
> Only the hsqldb implementation uses more than the property notNull of
> the column. The new method is now used getSqlString of class Column.
>
> Please find the patch files attached.
>
> Cheers, Patrick
>
> Patrick Carl schrieb:
> > Hello there,
> >
> > when using Torque with hsqldb adn native id generation Torque uses the
> > column constraint "IDENTITY" of hsqldb. This creates by default primary

> > key ids starting with 0. This can lead to false behaviour in the
> > following conditions:
> > It is possible that an object A with id 0 is created. If this object is

> > refered by an related object B, the method B.getA does not work, since
> > B.getA checks if B.aId != 0.
> >
> > To prevent this I created the attached patches. Using them will set the

> > starting id of an identity column to 1.
> >
> > Please note that I wasn't abled to get the test project to work, so I
> > couldn't test this patch as much as I would. Perhaps someone else can
do
> > this.
> >
> > Patrick
> >
> >
> >
------------------------------------------------------------------------
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
> > For additional commands, e-mail: torque-dev-help@db.apache.org
> Index:
src/java/org/apache/torque/engine/platform/PlatformHypersonicImpl.java
> ===================================================================
> ---
> src/java/org/apache/torque/engine/platform/PlatformHypersonicImpl.
> java   (Revision 348110)
> +++
> src/java/org/apache/torque/engine/platform/PlatformHypersonicImpl.
> java   (Arbeitskopie)
> @@ -18,7 +18,8 @@
>
>  import org.apache.torque.engine.database.model.Domain;
>  import org.apache.torque.engine.database.model.SchemaType;
> -
> +import org.apache.torque.engine.database.model.Column;
> +import org.apache.torque.engine.database.model.IDMethod;
>  /**
>   * HSQLDB (formerly known as Hypersonic) Platform implementation.
>   *
> @@ -35,7 +36,7 @@
>          super();
>          initialize();
>      }
> -
> +
>      /**
>       * Initializes db specific domain mapping.
>       */
> @@ -47,6 +48,19 @@
>          setSchemaDomainMapping(new Domain(SchemaType.VARBINARY,
"BINARY"));
>          setSchemaDomainMapping(new Domain(SchemaType.BLOB, "BINARY"));
>          setSchemaDomainMapping(new Domain(SchemaType.CLOB,
"LONGVARCHAR"));
> -   }
> -
> +    }
> +
> +
> +    public String getAutoIncrement()
> +    {
> +        return "GENERATED BY DEFAULT AS IDENTITY (START WITH 1)";
> +    }
> +
> +    public String getNullString(Column col)
> +    {
> +        if(col.isPrimaryKey() && IDMethod.NATIVE.equals(col.
> getTable().getIdMethod()))
> +            return "";
> +
> +        return super.getNullString(col);
> +    }
>  }
> Index:
>
src/test/org/apache/torque/engine/database/model/HypersonicDomainTest.java
> ===================================================================
> ---
> src/test/org/apache/torque/engine/database/model/HypersonicDomainTest.
> java   (Revision 348110)
> +++
> src/test/org/apache/torque/engine/database/model/HypersonicDomainTest.
> java   (Arbeitskopie)
> @@ -113,8 +113,8 @@
>      {
>          Table table = db.getTable("native");
>          Column col = table.getColumn("native_id");
> -        assertEquals("IDENTITY", col.getAutoIncrementString());
> -        assertEquals("native_id INTEGER NOT NULL IDENTITY", col.
> getSqlString());
> +        assertEquals("GENERATED BY DEFAULT AS IDENTITY (START WITH
> 1)", col.getAutoIncrementString());
> +        assertEquals("native_id INTEGER GENERATED BY DEFAULT AS
> IDENTITY (START WITH 1)", col.getSqlString());
>          col = table.getColumn("name");
>          assertEquals("", col.getAutoIncrementString());
>      }
> Index: src/java/org/apache/torque/engine/platform/Platform.java
> ===================================================================
> --- src/java/org/apache/torque/engine/platform/Platform.java
> (Revision 348110)
> +++ src/java/org/apache/torque/engine/platform/Platform.java
(Arbeitskopie)
> @@ -15,7 +15,7 @@
>   * See the License for the specific language governing permissions and
>   * limitations under the License.
>   */
> -
> +import org.apache.torque.engine.database.model.Column;
>  import org.apache.torque.engine.database.model.Domain;
>  import org.apache.torque.engine.database.model.SchemaType;
>
> @@ -61,6 +61,13 @@
>      String getNullString(boolean notNull);
>
>      /**
> +     * @return The RDBMS-specific SQL fragement for <code>NULL</code>
> +     * or <code>NOT NULL</code> depending on the given column
> +     */
> +    String getNullString(Column column);
> +
> +
> +    /**
>       * @return The RDBMS-specific SQL fragment for autoincrement.
>       */
>      String getAutoIncrement();
> Index:
src/java/org/apache/torque/engine/platform/PlatformDefaultImpl.java
> ===================================================================
> --- src/java/org/apache/torque/engine/platform/PlatformDefaultImpl.
> java   (Revision 348110)
> +++ src/java/org/apache/torque/engine/platform/PlatformDefaultImpl.
> java   (Arbeitskopie)
> @@ -20,6 +20,7 @@
>  import java.util.Iterator;
>  import java.util.Map;
>
> +import org.apache.torque.engine.database.model.Column;
>  import org.apache.torque.engine.database.model.Domain;
>  import org.apache.torque.engine.database.model.SchemaType;
>
> @@ -97,8 +98,19 @@
>          // the old Sybase templates.
>          return (notNull ? "NOT NULL" : "");
>      }
> -
> +
>      /**
> +     * @return Only produces a SQL fragment if null values are
> +     * disallowed.
> +     * @see Platform#getNullString(boolean)
> +     */
> +
> +    public String getNullString(Column col)
> +    {
> +         return getNullString(col.isNotNull());
> +    }
> +
> +    /**
>       * @see Platform#getAutoIncrement()
>       */
>      public String getAutoIncrement()
> Index: src/java/org/apache/torque/engine/database/model/Column.java
> ===================================================================
> --- src/java/org/apache/torque/engine/database/model/Column.java
> (Revision 348110)
> +++ src/java/org/apache/torque/engine/database/model/Column.java
> (Arbeitskopie)
> @@ -439,7 +439,7 @@
>      public String getNotNullString()
>      {
>          return getTable().getDatabase().getPlatform()
> -                .getNullString(this.isNotNull());
> +                .getNullString(this);
>      }
>
>      /**
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
> For additional commands, e-mail: torque-dev-help@db.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Mime
View raw message