Re: Select Query on Table with no Primary Key

From: Dave Merrin (dmerri..pasystems.co.uk)
Date: Thu Jun 07 2007 - 05:33:11 EDT

  • Next message: Tore Halset: "Re: Select Query on Table with no Primary Key"

    OK, I've stepped through the code and got to the ObjectResolver. In
    there it checks for primary keys and throws an exception if there aren't
    any. Is there any way I can override this code easily to removed the
    primary key check?

        ObjectResolver(DataContext context, ObjEntity entity, boolean refresh,
                boolean resolveInheritanceHierarchy) {
            init(context, entity, refresh, resolveInheritanceHierarchy);
        }

        void init(
                DataContext context,
                ObjEntity entity,
                boolean refresh,
                boolean resolveInheritanceHierarchy) {
            // sanity check
            DbEntity dbEntity = entity.getDbEntity();
            if (dbEntity == null) {
                throw new CayenneRuntimeException("ObjEntity '"
                        + entity.getName()
                        + "' has no DbEntity.");
            }

            this.primaryKey = dbEntity.getPrimaryKey();
            if (primaryKey.size() == 0) {
                throw new CayenneRuntimeException("Won't be able to create
    ObjectId for '"
                        + entity.getName()
                        + "'. Reason: DbEntity '"
                        + dbEntity.getName()
                        + "' has no Primary Key defined.");
            }

            this.context = context;
            this.cache = context.getObjectStore().getDataRowCache();
            this.refreshObjects = refresh;
            this.entity = entity;
            this.inheritanceTree =
    context.getEntityResolver().lookupInheritanceTree(entity);
            this.resolveInheritance = (inheritanceTree != null)
                    ? resolveInheritanceHierarchy
                    : false;
        }
    Michael Gentry wrote:
    > The only thing I can think of trying (and maybe Andrus/Tore/Mike/etc
    > would
    > have better ideas) is to model that ObjEntity (and perhaps others it
    > relates
    > to?) as read-only and see if Cayenne stops caring about missing a PK.
    > Just
    > a thought -- I've not tried it.
    >
    > /dev/mrg
    >
    >
    > On 6/6/07, Dave Merrin <dmerri..pasystems.co.uk> wrote:
    >>
    >> Sorry, I forgot to mention that I won't be updating the data. I would
    >> like to move round the database using relationships though.
    >>
    >> Apart from changing the database are there any hacks I could try to get
    >> round this problem.
    >>
    >> Cheers,
    >>
    >> Dave
    >>
    >> Michael Gentry wrote:
    >> > Cayenne needs PKs in order to do UPDATEs. If you aren't modifying the
    >> > data,
    >> > you might try fetching as data rows instead of CayenneDataObjects.
    >> > I'm not
    >> > certain if that would work, but has a much higher chance. Of course,
    >> you
    >> > still won't be able to make a CayenneDataObject out of it.
    >> >
    >> > /dev/mrg
    >> >
    >> >
    >> > On 6/6/07, Dave Merrin <dmerri..pasystems.co.uk> wrote:
    >> >>
    >> >> Hi,
    >> >>
    >> >> I'm trying to run a SelectQuery on a table with no primary key.
    >> >> Unfortunately it's not working. Can anybody help? I have no control
    >> over
    >> >> the database so I can't add in primary keys.
    >> >>
    >> >> Cheers,
    >> >>
    >> >> Dave
    >> >>
    >> >> INFO QueryLogger: SELECT t0.ID, t0.KIND, t0.TIMESTAMP FROM
    >> >> MPS.STATETABLE_CPT t0
    >> >> INFO QueryLogger: === returned 949 rows. - took 203 ms.
    >> >> INFO QueryLogger: +++ transaction committed.
    >> >> Exception in thread "main"
    >> org.apache.cayenne.CayenneRuntimeException:
    >> >> [v.2.0.3 May 6 2007] Won't be able to create ObjectId for
    >> >> 'StatetableCpt'. Reason: DbEntity 'STATETABLE_CPT' has no Primary Key
    >> >> defined.
    >> >> at
    >> >> org.apache.cayenne.access.ObjectResolver.init(ObjectResolver.java:75)
    >> >> at
    >> >>
    >> org.apache.cayenne.access.ObjectResolver.<init>(ObjectResolver.java:57)
    >> >> at
    >> >>
    >> org.apache.cayenne.access.DataDomainQueryAction.interceptObjectConversion(
    >>
    >> >>
    >> >> DataDomainQueryAction.java:319)
    >> >> at
    >> >> org.apache.cayenne.access.DataDomainQueryAction.execute(
    >> >> DataDomainQueryAction.java:116)
    >> >> at
    >> org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java
    >> >> :746)
    >> >> at
    >> >> org.apache.cayenne.util.ObjectContextQueryAction.runQuery(
    >> >> ObjectContextQueryAction.java:217)
    >> >> at
    >> >> org.apache.cayenne.access.DataContextQueryAction.execute(
    >> >> DataContextQueryAction.java:54)
    >> >> at
    >> >> org.apache.cayenne.access.DataContext.onQuery(DataContext.java:1387)
    >> >> at
    >> >> org.apache.cayenne.access.DataContext.performQuery(DataContext.java
    >> :1376)
    >> >>
    >> >> at
    >> >>
    >> ipa.printexpress.datahelpers.Session.fetchEntityCollection(Session.java
    >> >> :158)
    >> >> at
    >> >> ipa.px.importer.abb.ABBImporterMain.main(ABBImporterMain.java:109)
    >> >>
    >> >
    >>
    >>
    >



    This archive was generated by hypermail 2.0.0 : Thu Jun 07 2007 - 05:36:41 EDT