Re: Improvement ? code generation (templates)

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Wed Mar 07 2007 - 11:46:36 EST

  • Next message: Eric Floehr: "RE: Help: getting NPE at ObjectStoreGraphDiff.preprocess"

    Ok, now I understand.

    Let's take a look at it from Cayenne standpoint. Within a single
    DataContext Cayenne has a notion of uniquing, so no two objects are
    equal. Across the contexts, objects are equal if their ObjectIds are
    equal. Otherwise property value equality means nothing to Cayenne. So
    what's equal and what's not is very much context dependent :-) and
    therefore java.lang.Object.equals() is the most appropriate default.

    Now, IIRC, there won't be much harm done if you decide to implement
    those methods on your own. But you don't have to put these methods in
    the generated code. A generic method placed in a common superclass
    can handle it easily (common superclass, aka "wedge class", is a
    subclass of CayenneDataObject and can be set via a "Superclass" field
    in the ObjEntity editor panel).

    Cayenne persistent objects have access to their ObjectContext, so by
    definition they have access to their mapping metadata via
    EntityResolver, so comparison can be done in a generic fashion,
    iterating via mapped attributes.

    Andrus

    On Mar 7, 2007, at 6:30 PM, jerome moliere wrote:

    > 2007/3/7, Andrus Adamchik <andru..bjectstyle.org>:
    >>
    >> Hi Jerome,
    >>
    >> Could you give specific examples of the code you want to see
    >> generated?
    >
    >
    >
    > yes of course I can, this is an excerpt from one of my Java class...
    > This class has different attributes (name and so on):
    >
    >
    > /* (non-Javadoc)
    > *..ee java.lang.Object#equals(java.lang.Object)
    > */
    > ..verride
    > public boolean equals(Object obj) {
    > if (this == obj) {
    > return true;
    > }
    > if (!(obj instanceof PersistentField)) {
    > return false;
    > }
    > PersistentField rhs = (PersistentField) obj;
    > return new EqualsBuilder().append(name, rhs.name).append(
    > ordinalPosition, rhs.ordinalPosition)
    > .isEquals();
    >
    > }// equals()
    >
    > /* (non-Javadoc)
    > *..ee java.lang.Object#hashCode()
    > */
    > ..verride
    > public int hashCode() {
    > return new HashCodeBuilder().append(name).append
    > (ordinalPosition)
    > .append(genre).toHashCode();
    > }
    > /* (non-Javadoc)
    > *..ee java.lang.Object#toString()
    > */
    > ..verride
    > public String toString() {
    > return new ToStringBuilder(this).append("column", name).append(
    > "dataType", dataType).append("isNullable",
    > isNullable).append("Fk member :",isFkMember).append("isPkmember",
    > isPkMember())
    > .append("typname",genre).append("refers to
    > table:",refersTo)
    > .toString();
    > }
    >
    >
    > these methods use the COmmons Lang main classes (ToStringBuilder
    > and so on)
    > to generate the hashcode/equals/toString methods...
    >
    >> From your message I don't quite understand why we need to
    >> change the *default* template?
    > Because I think it may be generated directly from the Modeler as
    > the super
    > classes (generated as _MyClass.java)
    >
    >
    > Cheers
    > jerome
    > --
    > Jerome Moliere - Mentor/J
    > http://romjethoughts.blogspot.com/
    > auteur Eyrolles



    This archive was generated by hypermail 2.0.0 : Wed Mar 07 2007 - 11:47:10 EST