Considering the primary key value is the unique identifier for the
object... it is expected behaviour.

Mark

On Thu, Jan 29, 2009 at 7:56 AM, Jamie Krug <jamiek...@gmail.com> wrote:
>
> Bob,
>
> Thanks for the quick reply! While your suggestion is absolutely
> correct, it does not correct the problem I'm having. In fact, in my
> actual unit test, I was indeed calling get() again after discard() (I
> was calling get() in my setUp() method and discard() in my tearDown()
> method, if you're familiar with MXUnit or similar) -- when I
> translated this into a static test, for the sake of this post, I made
> the mistake that you've picked up on. That said, after correcting it,
> I'm still seeing unexpected results.
>
> That said, your correction did allow me to try out another hunch, with
> different results this time. When I use similar code, but change a non-
> primary-key property, both discard() and discardByClassAndKey() work
> exactly as expected! I guess if you change the value of any Transfer
> object's ID (primary key) you can't discard the object from cache
> without using discardAll(). Stranger still is the fact that I can call
> get() with the ID value that's in the database, but then calling getID
> () on that object returns a different value -- the dirty value!?!
>
> I guess it's rather unusual to be calling a setter on your ID property
> -- maybe wouldn't even occur in a production app, but just in my test
> case scenario. So, would this be considered a bug or expected
> behavior?
>
> Here's some updated test code to demonstrate:
>
> transfer.discardAll();
>
> stateNY = transfer.get('location.UsState', 'NY');
>
> writeOutput(stateNY.getStateName() & '<br />'); //output is "New
> York" (expected)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "false" (expected)
>
> stateNY.setStateName('');
> writeOutput(stateNY.getStateName() & '<br />'); //output is
> "" (expected)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "true" (expected)
>
> transfer.discard(stateNY);
> stateNY = transfer.get('location.UsState', 'NY');
> writeOutput(stateNY.getStateName() & '<br />'); //output is "New
> York" (expected)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "false" (expected)
>
> stateNY.setStateName('');
> writeOutput(stateNY.getStateName() & '<br />'); //output is
> "" (expected)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "true" (expected)
>
> transfer.discardByClassAndKey('location.UsState', 'NY');
> stateNY = transfer.get('location.UsState', 'NY');
> writeOutput(stateNY.getStateName() & '<br />'); //output is "New
> York" (expected)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "false" (expected)
>
> writeOutput(stateNY.getStateCode() & '<br />'); //output is
> "NY" (expected)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "false" (expected)
>
> stateNY.setStateCode('');
> writeOutput(stateNY.getStateCode() & '<br />'); //output is
> "" (expected)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "true" (expected)
>
> transfer.discard(stateNY);
> stateNY = transfer.get('location.UsState', 'NY');
> writeOutput(stateNY.getStateCode() & '<br />'); //output is "" (EXPECT
> "NY" !?!)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "true" (EXPECT "false" !?!)
>
> transfer.discardByClassAndKey('location.UsState', 'NY');
> stateNY = transfer.get('location.UsState', 'NY');
> writeOutput(stateNY.getStateCode() & '<br />'); //output is "" (EXPECT
> "NY" !?!)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "true" (EXPECT "false" !?!)
>
> transfer.discardByClassAndKey('location.UsState', '');
> stateNY = transfer.get('location.UsState', 'NY');
> writeOutput(stateNY.getStateCode() & '<br />'); //output is "" (EXPECT
> "NY" !?!)
> writeOutput(stateNY.getIsDirty() & '<br />'); //output is
> "true" (EXPECT "false" !?!)
> </cfscript>
>
> Best,
> Jamie
>
> On Jan 28, 3:14 pm, Bob Silverberg <bob.silverb...@gmail.com> wrote:
>> It looks like you're calling Transfer.discard(stateNY)  but then
>> trying to use the stateNY object again, without issuing another get().
>>  So stateNY is still pointing at the same object, even though it isn't
>> currently in the Transfer cache.
>>
>> If you think of it that way you'll see that your test results make
>> perfect sense.
>>
>> I think perhaps what you want to do is call stateNY =
>> transfer.get('location.UsState', 'NY'); again, after your discard, and
>> then check the values of the object.
>>
>> Bob
>>
>>
>>
>> On Wed, Jan 28, 2009 at 2:53 PM, Jamie Krug <jamiek...@gmail.com> wrote:
>>
>> > Hi, all,
>>
>> > I hope I'm missing something obvious, but I just can't peg it. I was
>> > purposely changing the key property of a Transfer object in a unit
>> > test object so I could test my validate() method (in my TO decorator).
>> > Suddenly a bunch of assertions that were successful started failing. I
>> > realized that I'm getting the cached version with the altered key
>> > field.
>>
>> > For simplicity, assume I have a usstate table with a PK column named
>> > abbreviation-char(2) and column named statename-varchar(20). I have
>> > the 'abbreviation' column aliased as 'stateCode' as you can see in
>> > this transfer.xml snippet:
>>
>> > <package name="location">
>> >        <object name="UsState" table="usstate"
>> > decorator="model.location.UsState">
>> >                <id name="stateCode" type="string" column="abbreviation" />
>> >                <property name="stateName" type="string" column="statename" 
>> > />
>> >        </object>
>> > </package>
>>
>> > When I get a state object with key 'NY' and change that key to
>> > '' (empty string), I can't seem to then discard this cached dirty
>> > object and access a fresh one from the database (unless I use the
>> > discardAll() method). I've tried discard() and I've tried
>> > discardByClassAndKey() with both the persisted key ('NY') and the
>> > dirty/changed one (''). Another get() for that object continues to
>> > return the dirty one, until I call discardAll() or restart the CF
>> > service.
>>
>> > Here's my test code, with comments stating the output I'm seeing...
>>
>> > transfer.discardAll();
>>
>> > stateNY = transfer.get('location.UsState', 'NY');
>> > writeOutput(stateNY.getStateCode() & '<br />'); //output is "NY"
>> > writeOutput(stateNY.getIsDirty() & '<br />'); //output is "false"
>>
>> > stateNY.setStateCode('');
>> > writeOutput(stateNY.getStateCode() & '<br />'); //output is ""
>> > writeOutput(stateNY.getIsDirty() & '<br />'); //output is "true"
>>
>> > transfer.discard(stateNY);
>> > writeOutput(stateNY.getStateCode() & '<br />'); //output is ""
>> > writeOutput(stateNY.getIsDirty() & '<br />'); //output is "true"
>>
>> > transfer.discardByClassAndKey('location.UsState', 'NY');
>> > writeOutput(stateNY.getStateCode() & '<br />'); //output is ""
>> > writeOutput(stateNY.getIsDirty() & '<br />'); //output is "true"
>>
>> > transfer.discardByClassAndKey('location.UsState', '');
>> > writeOutput(stateNY.getStateCode() & '<br />'); //output is ""
>> > writeOutput(stateNY.getIsDirty() & '<br />'); //output is "true"
>>
>> > Any thoughts would be much appreciated!
>>
>> > Thanks!
>> > Jamie
>>
>> --
>> Bob Silverbergwww.silverwareconsulting.com
> >
>



-- 
E: mark.man...@gmail.com
W: www.compoundtheory.com

--~--~---------~--~----~------------~-------~--~----~
Before posting questions to the group please read:
http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer

You received this message because you are subscribed to the Google Groups 
"transfer-dev" group.
To post to this group, send email to transfer-dev@googlegroups.com
To unsubscribe from this group, send email to 
transfer-dev-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/transfer-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to