And I was about to start trying your code samples :-) On Oct 14, 2010, at 8:44 PM, Borut Bolčina wrote:
> Only after I checked out the cayenne sources, debuged for a couple of hours > I checked again the relationship and found out I was referencing attribute > named mid instead of id attribute - what a plonker! I will make larger fonts > on my screen. > > Of course it works now. > > > 2010/10/14 Borut Bolčina <[email protected]> > >> Andrus, >> >> thanks for the tip. Unfortunately it does not work. Just now I replaced the >> code which fetches the two objects from shared to local datacontext with two >> queries which return the two objects in question (localMot and localTown) >> into the same datacontext. >> >> I commented the code which was "transfering" the two objects from shared >> data context before. This is how it looks now: >> >> // MapObjectType mot = >> persistenceService.findMapObjectType(MapObjectTypeEnum.STREET); >> // System.out.println("mot dc:" + mot.getDataContext()); >> // // mot lives in shared datacontext so we need a copy >> // MapObjectType localMot = (MapObjectType) >> dataContext.localObject(mot.getObjectId(), null); >> // System.out.println("localMot dc:" + >> localMot.getDataContext()); >> >> Expression e = >> ExpressionFactory.matchExp(MapObjectType.TYPE_PROPERTY, >> MapObjectTypeEnum.STREET); >> SelectQuery query = new SelectQuery(MapObjectType.class, e); >> List list = dataContext.performQuery(query); >> MapObjectType localMot = null; >> if (list.size() > 0) { >> localMot = (MapObjectType) list.get(0); >> } else { >> return false; >> } >> >> while (featureIterator.hasNext()) { >> SimpleFeature feature = (SimpleFeature) >> featureIterator.next(); >> >> Integer mid = >> Integer.parseInt(feature.getAttribute("UL_MID").toString()); >> >> String rawname = (String) feature.getAttribute("UL_UIME"); >> // prettyPrintHex(rawname.getBytes()); >> >> >> MapObject mapObject = >> dataContext.newObject(MapObject.class); >> Street street = dataContext.newObject(Street.class); >> >> street.setMid(mid); >> street.setName(rawname); >> >> Integer townMid = >> Integer.parseInt(feature.getAttribute("NA_MID").toString()); >> // Town town = persistenceService.findTownByMid(townMid); >> // System.out.println("town dc:" + town.getDataContext()); >> // if (town == null) { >> // logger.error("Street with mid {} has no town >> associated.", street.getMid()); >> // return false; // TODO tell why (each street must have >> a town) >> // } >> // // town lives in shared datacontext so we need a copy >> // Town localTown = (Town) >> dataContext.localObject(town.getObjectId(), null); >> // System.out.println("localTown dc:" + >> localTown.getDataContext()); >> // logger.debug("localTown: " + localTown); >> >> Expression e1 = >> ExpressionFactory.matchExp(Town.MID_PROPERTY, townMid); >> SelectQuery query1 = new SelectQuery(Town.class, e1); >> List list1 = dataContext.performQuery(query1); >> Town localTown = null; >> if (list1.size() > 0) { >> localTown = (Town) list1.get(0); >> } else { >> return false; >> } >> >> *street.setTown(localTown);* >> //localTown.addToStreets(street); >> >> >> >> >> mapObject.setStreet(street); >> mapObject.setMapObjectType(localMot); >> >> counter++; >> >> printDataContext(dataContext); >> >> logger.debug("Will import Street: " + street); >> >> dataContext.commitChanges(); >> } >> >> But the* town_mid is still NULL* while the other relationship >> (mapObject.setStreet(street)) is set correctly. >> >> [2010/10/14 09:57:16.327] INFO >> [AppModule.ImportService:getShapeFileFromClasspath]: Importing Street from >> jar:file:/C:/Users/borutb/.m2/repository/si/planet9/maps-geodata/0.0.2-SNAPSHOT/maps-geodata-0.0.2-SNAPSHOT.jar!/geodata/UL.shp >> [2010/10/14 09:57:16.361] DEBUG >> [AppModule.ImportService:getFeatureIteratorForShapeResource]: Setting Shape >> file encoding: windows-1250 >> [2010/10/14 09:57:16.586] INFO [access.QueryLogger:logQueryStart]: --- >> will run 1 query. >> [2010/10/14 09:57:16.589] INFO [access.QueryLogger:logBeginTransaction]: >> --- transaction started. >> [2010/10/14 09:57:16.590] INFO [access.QueryLogger:logQuery]: SELECT >> t0.id, t0.type FROM maps.map_object_type t0 WHERE t0.type = ? [bind: >> 1->type:STREET=3] >> [2010/10/14 09:57:16.593] INFO [access.QueryLogger:logSelectCount]: === >> returned 1 row. - took 3 ms. >> [2010/10/14 09:57:16.594] INFO [access.QueryLogger:logCommitTransaction]: >> +++ transaction committed. >> [2010/10/14 09:57:16.619] INFO [access.QueryLogger:logQueryStart]: --- >> will run 1 query. >> [2010/10/14 09:57:16.622] INFO [access.QueryLogger:logBeginTransaction]: >> --- transaction started. >> [2010/10/14 09:57:16.623] INFO [access.QueryLogger:logQuery]: SELECT >> t0.name, t0.id, t0.mid, t0.label_y, t0.label_x FROM maps.town t0 WHERE >> t0.mid = ? [bind: 1->mid:10083931] >> [2010/10/14 09:57:16.625] INFO [access.QueryLogger:logSelectCount]: === >> returned 1 row. - took 3 ms. >> [2010/10/14 09:57:16.627] INFO [access.QueryLogger:logCommitTransaction]: >> +++ transaction committed. >> NEW objects >> {<ObjectId:Street, TEMP:000001BE35CB1188>; new; [name=>Ulica Milana >> Klemenčiča; mapObjects=>(..); town=>{<ObjectId:Town, id=446>}; >> mid=>19568962; houseNumbers=>(..)]} >> {<ObjectId:MapObject, TEMP:000000BE35C71188>; new; >> [mapObjectType=>{<ObjectId:MapObjectType, id=4>}; street=>{<ObjectId:Street, >> TEMP:000001BE35CB1188>}]} >> >> DELETED objects >> MODIFIED objects >> {<ObjectId:MapObjectType, id=4>; modified; [mapObjects=>(..); >> type=>STREET]} >> {<ObjectId:Town, id=446>; modified; [name=>Ajdovščina; mapObjects=>?; >> streets=>(..); mid=>10083931; labelY=>85131.71; houseNumbers=>?; >> labelX=>416031.93]} >> UNCOMMITED objects >> >> {<ObjectId:MapObjectType, id=4>; modified; [mapObjects=>(..); >> type=>STREET]} >> {<ObjectId:Town, id=446>; modified; [name=>Ajdovščina; mapObjects=>?; >> streets=>(..); mid=>10083931; labelY=>85131.71; houseNumbers=>?; >> labelX=>416031.93]} >> {<ObjectId:Street, TEMP:000001BE35CB1188>; new; [name=>Ulica Milana >> Klemenčiča; mapObjects=>(..); town=>{<ObjectId:Town, id=446>}; >> mid=>19568962; houseNumbers=>(..)]} >> {<ObjectId:MapObject, TEMP:000000BE35C71188>; new; >> [mapObjectType=>{<ObjectId:MapObjectType, id=4>}; street=>{<ObjectId:Street, >> TEMP:000001BE35CB1188>}]} >> [2010/10/14 09:57:16.633] DEBUG >> [AppModule.ImportService:importStreetsData]: Will import Street: >> {<ObjectId:Street, TEMP:000001BE35CB1188>; new; [name=>Ulica Milana >> Klemenčiča; mapObjects=>(..); town=>{<ObjectId:Town, id=446>}; >> mid=>19568962; houseNumbers=>(..)]} >> [2010/10/14 09:57:21.709] INFO [access.QueryLogger:logQueryStart]: --- >> will run 2 queries. >> [2010/10/14 09:57:21.718] INFO [access.QueryLogger:logBeginTransaction]: >> --- transaction started. >> [2010/10/14 09:57:21.734] INFO [access.QueryLogger:logQuery]: INSERT INTO >> maps.street (mid, name, town_mid) VALUES (?, ?, ?) >> [2010/10/14 09:57:21.742] INFO [access.QueryLogger:logQueryParameters]: >> [bind: 1->mid:19568962, 2->name:'Ulica Milana Klemenčiča', * >> 3->town_mid:NULL*] >> [2010/10/14 09:57:21.756] INFO [access.QueryLogger:logGeneratedKey]: >> Generated PK: street.id = 1 >> [2010/10/14 09:57:21.763] INFO [access.QueryLogger:logUpdateCount]: === >> updated 1 row. >> [2010/10/14 09:57:21.770] INFO [access.QueryLogger:logQuery]: INSERT INTO >> maps.map_object (company_id, house_number_id, map_object_type_id, poi_id, >> post_office_id, street_id, town_id) VALUES (?, ?, ?, ?, ?, ?, ?) >> [2010/10/14 09:57:21.778] INFO [access.QueryLogger:logQueryParameters]: >> [bind: 1->company_id:NULL, 2->house_number_id:NULL, * >> 3->map_object_type_id:4*, 4->poi_id:NULL, 5->post_office_id:NULL, >> 6->street_id:1, 7->town_id:NULL] >> [2010/10/14 09:57:21.787] INFO [access.QueryLogger:logGeneratedKey]: >> Generated PK: map_object.id = 15997 >> [2010/10/14 09:57:21.794] INFO [access.QueryLogger:logUpdateCount]: === >> updated 1 row. >> [2010/10/14 09:57:21.831] INFO [access.QueryLogger:logCommitTransaction]: >> +++ transaction committed. >> >> If this is a bug, what would you recomend? >> >> Thanks, >> Borut >> >> >> 2010/10/13 Andrus Adamchik <[email protected]> >> >> Hi Borut, >>> >>> On Oct 13, 2010, at 12:02 PM, Borut Bolčina wrote: >>> >>>> MapObjectType localMot = (MapObjectType) >>>> dataContext.localObject(mot.getObjectId(), mot); >>> >>> Not sure if there's anything else involved, but the use of 'localObject' >>> is suspect. Try using null as the second argument: >>> >>> MapObjectType localMot = (MapObjectType) >>> dataContext.localObject(mot.getObjectId(), null); >>> >>> This is a piece of less intuitive API in Cayenne. I really wish to replace >>> it with something more explicit... >>> >>> Andrus >>> >>> >>
