Re: [JIRA] Created: (CAY-538) Relationship not refreshed before committing the context.

From: Marcin Skladaniec (marci..sh.com.au)
Date: Wed May 03 2006 - 02:29:45 EDT

  • Next message: Tore Halset: "extended type and subclasses"

    You are absolutely right Michael.
    In CRoom have overriden setSite method :

            public void setSite(CSite site) {
                    if (getSite() != null) {
                            getSite().removeFromRooms(this);
                    }
                    super.setSite(site);
            }

    and everything works.
    Does it mean that I have to override setter in every many to one
    relationship ? Is there any reason why cayenne itself shouldn't do
    that ?
    It seems not right for me.

    Regards
    Marcin

    On 02/05/2006, at 11:21 PM, Gentry, Michael ((Contractor)) wrote:

    > Marcin,
    >
    > I'm not certain this is a Cayenne bug. I think it is more of a
    > misunderstanding. When you do:
    >
    > logger.info("(here relationship is modified)");
    > temproom.setSite(tempsite2);
    >
    > You point the room's site to site2, but you never unlinked the
    > relationship from site1->room. Therefore, when you then do:
    >
    > logger.info("site 1 rooms");
    > rooms = tempsite1.getRooms();
    > for (int i=0; i<rooms.size();i++) {
    > logger.info("\troom "+i+" :
    > "+((CRoom)rooms.get(i)).getName());
    > }
    >
    > tempsite1 will still print the room out because the room is still it
    > site1's rooms relationship. Try:
    >
    > logger.info("(here relationship is modified)");
    > tempsite1.removeFromRooms(temproom);
    > temproom.setSite(tempsite2);
    >
    > And see if it helps.
    >
    > /dev/mrg
    >
    >
    >
    > -----Original Message-----
    > From: Marcin Skladaniec (JIRA) [mailto:jir..pache.org]
    > Sent: Monday, May 01, 2006 9:53 PM
    > To: cayenne-de..ncubator.apache.org
    > Subject: [JIRA] Created: (CAY-538) Relationship not refreshed before
    > committing the context.
    >
    >
    > Relationship not refreshed before committing the context.
    > ----------------------------------------------------------
    >
    > Key: CAY-538
    > URL: http://issues.apache.org/cayenne/browse/CAY-538
    > Project: Cayenne
    > Type: Bug
    >
    > Components: Cayenne Core Library
    > Versions: 1.2 [BETA]
    > Environment: I think any platform, but tested on os x and freebsd.
    > Cayenne 3t
    > Reporter: Marcin Skladaniec
    >
    >
    > I have two sites : site1 and site2 and a room linked to site1
    > If I change the relationship so the room links to site2, than before I
    > commit the changes both sites are linked to the room.
    >
    > The code
    >
    > {
    > Expression expression =
    > ExpressionFactory.matchExp(CSite.NAME_PROPERTY, "site1");
    > SelectQuery query = new SelectQuery(CSite.class,
    > expression);
    > List list = context2.performQuery(query);
    > CSite tempsite1 = (CSite)list.get(0);
    >
    > expression =
    > ExpressionFactory.matchExp(CSite.NAME_PROPERTY, "site2");
    > query = new SelectQuery(CSite.class, expression);
    > list = context2.performQuery(query);
    > CSite tempsite2 = (CSite)list.get(0);
    >
    >
    > expression =
    > ExpressionFactory.matchExp(CRoom.NAME_PROPERTY, "room");
    > query = new SelectQuery(CRoom.class, expression);
    > list = context2.performQuery(query);
    > CRoom temproom = (CRoom)list.get(0);
    >
    >
    > logger.info("site 1 rooms");
    > List rooms = tempsite1.getRooms();
    > for (int i=0; i<rooms.size();i++) {
    > logger.info("\troom "+i+" :
    > "+((CRoom)rooms.get(i)).getName());
    > }
    >
    > logger.info("site 2 rooms");
    > rooms = tempsite2.getRooms();
    > for (int i=0; i<rooms.size();i++) {
    > logger.info("\troom "+i+" :
    > "+((CRoom)rooms.get(i)).getName());
    > }
    > logger.info("(here relationship is modified)");
    > temproom.setSite(tempsite2);
    >
    > logger.info("site 1 rooms");
    > rooms = tempsite1.getRooms();
    > for (int i=0; i<rooms.size();i++) {
    > logger.info("\troom "+i+" :
    > "+((CRoom)rooms.get(i)).getName());
    > }
    >
    > logger.info("site 2 rooms");
    > rooms = tempsite2.getRooms();
    > for (int i=0; i<rooms.size();i++) {
    > logger.info("\troom "+i+" :
    > "+((CRoom)rooms.get(i)).getName());
    > }
    > }
    >
    > produces output :
    > site 1 rooms
    > room 0 : room
    > site 2 rooms
    > (here relationship is modified)
    > site 1 rooms
    > room 0 : room
    > site 2 rooms
    > room 0 : room
    >
    > I can publish a small project reproducing this bug.
    >
    > --
    > This message is automatically generated by JIRA.
    > -
    > If you think it was sent incorrectly contact one of the
    > administrators:
    > http://issues.apache.org/cayenne/secure/Administrators.jspa
    > -
    > For more information on JIRA, see:
    > http://www.atlassian.com/software/jira
    >

    -------------------------->
    ish
    http://www.ish.com.au
    Level 1, 30 Wilson Street Newtown 2042 Australia
    phone +61 2 9550 5001 fax +61 2 9550 4001



    This archive was generated by hypermail 2.0.0 : Wed May 03 2006 - 02:30:13 EDT