Re: [CONF] Apache Cayenne: XML Mapping File (page edited)

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Thu Jan 03 2008 - 04:48:04 EST

  • Next message: Gilberto C Andrade (JIRA): "[JIRA] Created: (CAY-951) Enhancement don't work with more complex annotation"

    For examples you can check Cayenne source code, specifically
    "org.apache.cayenne.dba" package and database specific subpackages
    such as "org.apache.cayenne.dba.oracle", etc.

    Andrus

    On Jan 3, 2008, at 4:22 AM, Terrence A. Pietrondi wrote:

    > Thanks Andrus. I'll accept everything you've mentioned
    > about the primary key generator, now just need a
    > simple example to follow and test it =). I searched
    > through the mailing list today, and it seems that an
    > Oracle key generator that simply increments the max by
    > one is very popular, but I didn't find any examples
    > (code). The methods 'generatePkForDbEntity' and
    > 'reset' in the Javadoc don't detail what should be
    > done when implemented.
    >
    > Any suggestions or URLS?
    >
    > Example on installing it as well will be helpful since
    > I am unclear on your notes below.
    >
    > Thanks.
    >
    > --- Andrus Adamchik <andru..bjectstyle.org> wrote:
    >
    >> Hi Terrence,
    >>
    >> Sorry for not replying earlier ... lots of things on
    >> Cayenne front
    >> plus the holidays :-)
    >>
    >> Re: ObjectId question:
    >>
    >> Putting PK values in the map returned by
    >> 'getReplacementIdMap' is
    >> guaranteed to get picked up by Cayenne on commit and
    >> processed
    >> properly. If you change the ObjectId by hand, the
    >> behavior is
    >> unpredictable, as the ObjectId is used as a key in
    >> the internal cache
    >> maps. In fact it may vary between different versions
    >> of Cayenne (I
    >> think we did catch manual ObjectId changes before,
    >> but I can't locate
    >> this code in 3.0 anymore... may still be there, just
    >> that I forgot
    >> where it was).
    >>
    >> But an official way to install a custom PkGenerator
    >> is by implementing
    >> your own org.apache.cayenne.dba.PkGenerator. The
    >> generator should
    >> only implement the 'generatePkForDbEntity' and
    >> 'reset' methods. The
    >> rest can simply throw
    >> "UnsupportedOperationException" as they are not
    >> called in runtime. There are a few ways to install
    >> custom PkGenerator:
    >>
    >> * Cast runtime DbAdapter to JdbcAdapter or
    >> AutoAdapter as appropriate
    >> and call "setPkGenerator()"
    >> * Subclass OracleAdapter, overriding
    >> 'JdbcAdapter.createPkGenerator()'
    >> method, and entering the name of your adapter for
    >> DataNode in the
    >> Modeler.
    >>
    >> As Ari mentioned, your solution (as well as
    >> 'getReplacementIdMap'
    >> solution) has a race condition (that may or may not
    >> be relevant in
    >> your environment). Consider that between the time
    >> you obtain a PK with
    >> a query and a commit, another thread/process can
    >> attempt an insert and
    >> get the same id. As a result one of the two commits
    >> will fail with a
    >> duplicate PK SQL exception (or much worse - go
    >> through if the
    >> constraint is not defined on oracle, resulting in
    >> corrupt data).
    >>
    >> PkGenerator solution is less prone to a race
    >> condition, as it is done
    >> in the same JDBC transaction as the main commit,
    >> however it also
    >> depends on how you implement it (SELECT ... FOR
    >> UPDATE may be needed
    >> here).
    >>
    >> Hope this helps.
    >> Andrus
    >>
    >>
    >>
    >> On Dec 27, 2007, at 4:46 PM, Terrence A. Pietrondi
    >> wrote:
    >>
    >>> Any feedback on this topic? I read the mentioned
    >>> "Handling Inheritance" article, if I shouldn't use
    >> the
    >>> table names, how can I check for my category
    >> concepts
    >>> as I mentioned? Since there are multiple tables
    >> that
    >>> are the categories.
    >>>
    >>> I am a little unclear how using
    >>> ObjectId.getReplacementIdMap().put(...) might help
    >> as
    >>> mentioned in an earlier post. Is there any other
    >>> information I can better provide to better explain
    >> my
    >>> approach. How is this safer then using my own
    >> ObjectId
    >>> object and settings its id?
    >>
    >>
    >>
    >>
    >>> Thanks.
    >>>
    >>> --- "Terrence A. Pietrondi"
    >> <tepietrond..ahoo.com>
    >>> wrote:
    >>>
    >>>>
    >>>> --- Aristedes Maniatis <ar..sh.com.au> wrote:
    >>>>
    >>>>> The simplest way to have Cayenne handle PK
    >>>>> generation is to follow the
    >>>>> instructions here:
    >>>>>
    >>>>>
    >>>>
    >>>
    >>
    > http://cayenne.apache.org/doc/generate-primary-key-support.html
    >>>>>
    >>>>> That will implement a solution which is thread
    >>>> safe
    >>>>> and portable
    >>>>> between databases. I don't believe your solution
    >>>>> would be thread safe.
    >>>>>
    >>>>
    >>>> Here is the trick, the work I am doing is on an
    >>>> existing database (Oracle) and I do not have
    >> access
    >>>> to
    >>>> modify the existing schema. It could be possible
    >>>> that
    >>>> I go through a review with our database
    >> developer,
    >>>> but
    >>>> I am trying to solve the problem within the
    >>>> constrains
    >>>> of his design. For whatever reason, he chose not
    >> to
    >>>> implement auto-key generation and is expecting
    >> that
    >>>> to
    >>>> take place in the application code. Whether that
    >> is
    >>>> a
    >>>> good design decision or not is arguable, but I'd
    >>>> like
    >>>> to continue the implementation of my solution
    >>>> without
    >>>> database modifications. And therefore, key
    >>>> generation
    >>>> is going to have to take place in the application
    >>>> code. Hope that is not too confusing.
    >>>>
    >>>>> What is it you are wanting to do here? One of
    >> the
    >>>>> primary purposes of
    >>>>> an ORM is to insulate the user from the database
    >>>>> schema, allowing you
    >>>>> to refactor the database naming and schema
    >> without
    >>>>> touching your Java
    >>>>> code. Hardcoding in database field names may not
    >>>> be
    >>>>> in the best
    >>>>> interests of this approach. Also the comments in
    >>>>> your example suggest
    >>>>> a one to one mapping between databases tables
    >>>>> (DbEntity) and
    >>>>> ObjEntity. This is not always true in Cayenne:
    >>>>>
    >>>>>
    >>>>
    >>>
    >>
    > http://cayenne.apache.org/doc/handling-inheritance.html
    >>>>>
    >>>>
    >>>> I have a service that has a method to set a value
    >>>> for
    >>>> an entry of a member on a table. This method is
    >>>> "annotating" a "member" of a "category"
    >>>> (conceptually). And so, when using the "annotate"
    >>>> method, of the arguments for this method are a
    >>>> "rule"
    >>>> and a "value". A "rule" is a column on the
    >> database
    >>>> table, and a table represents a "category". I
    >> need
    >>>> to
    >>>> map this "rule" to the correct property name in
    >>>> Cayenne so I can set it properly for the correct
    >>>> "member". To be clear, I am editing an existing
    >>>> entry
    >>>> in the table, but I am targeting a specific
    >> column
    >>>> to
    >>>> set, and I need to map from the column name to
    >> the
    >>>> property name.
    >>>>
    >>>> Thanks.
    >>>>
    >>>>
    >>>>
    >>>> Terrence A. Pietrondi
    >>>> http://del.icio.us/tepietrondi
    >>>>
    >>>>
    >>>>
    >>>>
    >>>
    >>
    > ____________________________________________________________________________________
    >>>> Looking for last minute shopping deals?
    >>>> Find them fast with Yahoo! Search.
    >>>>
    >>>
    >>
    > http://tools.search.yahoo.com/newsearch/category.php?category=shopping
    >>>>
    >>>
    >>>
    >>> Terrence A. Pietrondi
    >>> http://del.icio.us/tepietrondi
    >>>
    >>>
    >>>
    >>>
    >>
    > ____________________________________________________________________________________
    >>> Be a better friend, newshound, and
    >>> know-it-all with Yahoo! Mobile. Try it now.
    >>
    > http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ
    >>>
    >>>
    >>
    >>
    >
    >
    > Terrence A. Pietrondi
    > http://del.icio.us/tepietrondi
    >
    >
    >
    > ____________________________________________________________________________________
    > Looking for last minute shopping deals?
    > Find them fast with Yahoo! Search. http://tools.search.yahoo.com/newsearch/category.php?category=shopping
    >



    This archive was generated by hypermail 2.0.0 : Thu Jan 03 2008 - 04:48:52 EST