hi!

will do :)

back when i started with castor, about a month ago i guess, i skipped that
part. Now that i am able to work properly with castor, its about time i take
a look a that. 

thanks again :)

regards, 

noc2

Ralf Joachim-2 wrote:
> 
> Hi Noc2,
> 
> take a look at: http://castor.codehaus.org/key-generator.html about the
> options you have with keygenerators.
> 
> Regards
> Ralf
> 
> 
> Noc2 schrieb:
>> hello Ralf!
>> 
>> Thanks for you reply! I understand the problem now. Thanks for the
>> explanation.
>> 
>> While i was busy with the problem i noticed something else as well. I
>> mentioned something about mysql doing an auto-incrementation of the ID in
>> the Performance table. 
>> 
>> With the knowledge of your reply, i changed the code yesterday. I made a
>> new
>> field in the database called "Date" of the type date, and the start and
>> stop
>> have become bigint in the database. When i need to display time, the
>> bigints
>> are turned into longs, and the longs are then used in the Timeconstructor
>> in
>> java. 
>> 
>> Anyway, i decided to disable the auto-incrementation. I had to write
>> something to generate keys then, and i needed to test it. But my testcode
>> of
>> performance, and the testdatabase hadnt been changed yet, so i there was
>> no
>> bigint or separate "date" field yet, and you know what? With the
>> auto-increment disabled, the code did work. 
>> 
>> Are there perhaps any known bugs with the auto-increment? i performed a
>> quick search, but on behalf of my job, i cant spend too much time on
>> googling for problems that have been resolved already. 
>> 
>> Again, thank you very much for your reply, i learned something from it.
>> 
>> regards, 
>> noc2
>> 
>> 
>> 
>> Ralf Joachim-2 wrote:
>>> Hi Noc2,
>>>
>>> according to your description I can not see anything that you may be
>>> doing wrong. But there is one problem that I faced myself sometime ago.
>>>
>>> Let's assume you set your start timestamp as follows:
>>>
>>> perf.setStart(new Date());
>>>
>>> The start timestamp then holds a value that has millisecond resolution.
>>> If you store this value to a database column that has only second
>>> resolution the milliseconds will not be contained in the database. If
>>> you try to update this object in another transaction Castor will load
>>> the object from the database and compares it with the cached one. At
>>> this time Castor recognizes that the start timestamp form the database
>>> is not the same as the one of the object in cache because the
>>> milliseconds are missing. This will lead to a ObjectModifiedException as
>>> seen by you.
>>>
>>> Having said that this may also happen with other datatypes (e.g. if you
>>> store a 30 char string into a database field with only 25 chars).
>>>
>>> Regards
>>> Ralf
>>>
>>>
>>> Noc2 schrieb:
>>>> Hello everybody, 
>>>>
>>>> I am back with a new problem, a real mindcracker for me. As usual, it
>>>> is
>>>> possible that this problem is as easy as cake, then i will feel stupid
>>>> again, but as it is now (with my limited knowledge) i cant seem to find
>>>> a
>>>> solution. 
>>>>
>>>> The situation is as following: 
>>>>
>>>> check the next piece of mapping: 
>>>>
>>>> <<<<<<<<<<<<<<<<<<<mapping>>>>>>>>>>>>>>>>
>>>>
>>>> <field name="start" type="date">
>>>>                    <sql name="start" type="timestamp" />
>>>> </field>
>>>>
>>>> <field name="stop" type="date">
>>>>                    <sql name="stop" type="timestamp" />
>>>> </field>
>>>>
>>>> <<<<<<<<<<<<<<<<<< end of mapping >>>>>>>>>>>
>>>>
>>>> As you can see, i am trying to "convert" java date obj into a timestamp
>>>> object. 
>>>> This piece of mapping tries to map a Performance Object, the code
>>>> following
>>>> here: 
>>>>
>>>> *********************** start of code **************************
>>>>
>>>> public class Performance implements TimeStampable {
>>>>    
>>>>    private int performanceID;
>>>>    private int userID;
>>>>    private int activityID;
>>>>    private Date start;
>>>>    private Date stop;
>>>>    
>>>>    private long timestamp = 0;
>>>>    
>>>>    public long jdoGetTimeStamp(){
>>>>            return timestamp;
>>>>    }
>>>>    
>>>>    public void jdoSetTimeStamp(long timestamp){
>>>>            this.timestamp = timestamp;
>>>>    }
>>>>    
>>>>    
>>>>    public int getUserID() {
>>>>            return userID;
>>>>    }
>>>>    public void setUserID(int userID) {
>>>>            this.userID = userID;
>>>>    }
>>>>    public int getActivityID() {
>>>>            return activityID;
>>>>    }
>>>>    public void setActivityID(int activityID) {
>>>>            this.activityID = activityID;
>>>>    }
>>>>    public Date getStart() {
>>>>            return start;
>>>>    }
>>>>    public void setStart(Date start) {
>>>>            this.start = start;
>>>>    }
>>>>    public Date getStop() {
>>>>            return stop;
>>>>    }
>>>>    public void setStop(Date stop) {
>>>>            this.stop = stop;
>>>>    }
>>>>    public int getPerformanceID() {
>>>>            return performanceID;
>>>>    }
>>>>    public void setPerformanceID(int performanceID) {
>>>>            this.performanceID = performanceID;
>>>>    }
>>>> }
>>>>
>>>> ************************** end of code ***************************
>>>>
>>>> As you all can see, not much about it. 
>>>>
>>>> I recently solved the problems i had with caching and long
>>>> transactions,
>>>> everything worked perfectly, until i tried to create and update
>>>> Performance
>>>> objects in long transactions. 
>>>>
>>>> The scenario is as following: i create a performance object to track
>>>> the
>>>> start of some activity. Due to database restrictions (mysql), it is
>>>> impossible to have a timestamp entry that is null (this might have
>>>> nothing
>>>> to do with the problem but i think its better to just tell everything). 
>>>>
>>>> Ofcourse i also need to know when the activity stops, so i perform an
>>>> update
>>>> on the Performance object when the activity stops, and i would then
>>>> like
>>>> to
>>>> create a new Performance object for the next Activity. 
>>>>
>>>> But on the update, i get the following Exception and errormessage:
>>>>
>>>> org.exolab.castor.jdo.ObjectModifiedException: Invalid object timestamp
>>>> detected.
>>>>
>>>> Now, to me, this looks very strange. ObjectModifiedException is thrown
>>>> when
>>>> there is a concurrency problem, more accurate, when one transaction is
>>>> modifying an entry used by another transaction. 
>>>> In my case, this is not really possible, because every single operation
>>>> i
>>>> perform on the database is a transaction that has been committed. To
>>>> prove
>>>> this, i ll give the code i use to update. 
>>>>
>>>> ************** start of code *************
>>>> public void update(Object updatedObject) {
>>>>            try {
>>>>                    db.begin();
>>>>                    
>>>>                    db.update(updatedObject);
>>>>                    
>>>>                    logger.info("UPDATE COMPLETED");
>>>>                    
>>>>                    db.commit();
>>>>                    
>>>>            } catch (PersistenceException e) {
>>>>                    logger.fatal("PersistanceException : " + 
>>>> e.getMessage());
>>>>                    e.printStackTrace();
>>>>            }
>>>>    }
>>>> ********************* end of code **************
>>>> In the application, when i create the currentPerformanceObject, it has
>>>> no
>>>> ID. I let MySql create an auto increasing number for that. So i figured
>>>> i
>>>> might be making my own object a dirty one, because castor isnt aware of
>>>> the
>>>> change in the database. So logically i tried to set the the dirty
>>>> attribute
>>>> in the mappingfile to ingnore, but with no effect (this also means that
>>>> my
>>>> theory about the ID is not correct as well). 
>>>>
>>>> I dont have a clue what could be wrong. To complete this post, i ll add
>>>> the
>>>> pieces of code where all this stuff happens. 
>>>>
>>>> ********************** start of code *********************
>>>>
>>>>            activityList.getList().addSelectionListener(new 
>>>> SelectionListener(){
>>>>                    public void widgetSelected(SelectionEvent event){
>>>>                            MessageBox msgbox = new
>>>> MessageBox(site.getShell(),SWT.ICON_INFORMATION|SWT.YES|SWT.NO);
>>>>                            msgbox.setMessage("Are you sure you wish to 
>>>> start this activity?");
>>>>                            int msg = msgbox.open();
>>>>                            if(msg == SWT.YES){
>>>>                                    
>>>>                                    if(currentPerformance != null){
>>>>                                            endCurrentPerformance();
>>>>                                    }
>>>>                                    currentActivity =
>>>> (Activity)activityList.getElementAt(activityList.getList().getSelectionIndex());
>>>>                                    
>>>> status.setText(statusText+currentActivity.getName());
>>>>                                    
>>>>                                    logActivity();
>>>>                                    
>>>>                            }
>>>>                    }
>>>>
>>>>
>>>>    private void logActivity(){
>>>>            currentPerformance = new Performance();
>>>>            
>>>> currentPerformance.setActivityID(currentActivity.getActivityID());
>>>>            currentPerformance.setUserID(Application.conn.getCurrentUser());
>>>>            currentPerformance.setStart(new Date());
>>>>            currentPerformance.setStop(null);
>>>>            
>>>>            
>>>> Application.conn.getAccess().createPerformance(currentPerformance);
>>>>            
>>>>            System.out.println("THE TIMESTAMP OF THE PERFORMANCE OBJECT:
>>>> "+currentPerformance.jdoGetTimeStamp());
>>>>    }
>>>>
>>>> private void endCurrentPerformance(){
>>>>            currentPerformance.setStop(new Date());
>>>>            
>>>>            System.out.println("THE TIMESTAMP OF THE PERFORMANCE OBJECT WHEN
>>>> UPDATING:
>>>> "+currentPerformance.jdoGetTimeStamp());
>>>>            
>>>>            
>>>> Application.conn.getAccess().updatePerformance(currentPerformance);
>>>>            
>>>>            System.out.println("UPDATE COMPLETED");
>>>>    }
>>>>
>>>> ******************** end of code **********************
>>>>
>>>> As you can see, all the activities are contained in a listviewer. When
>>>> i
>>>> click an activity, i want to make sure that the user didnt accidently
>>>> clicked it, so i ask to confirm with a dialogbox. If there is a
>>>> currentPerformance, i update it in 'endCurrentPerformance', if not, i
>>>> just
>>>> create a new Performance in 'logActivity'. 
>>>>
>>>> In my opinion this is a very strange situation. The errormessage
>>>> indicates
>>>> that there is an invalid object timestamp. I know that when i create a
>>>> new
>>>> object, the timestamp has to be 0, as an indication that the object is
>>>> a
>>>> new
>>>> one. Castor changes the timestamp, so the object will not be forgotten. 
>>>>
>>>> I compare the timestamp value with the original one just before
>>>> updating,
>>>> and they are exactly the same. 
>>>>
>>>> In my application i use the same variable name to instantiate a new
>>>> Performance. But since instantiating means assigning a new reference to
>>>> the
>>>> variable, it can not be that the new object has the timestamp of the
>>>> object
>>>> that was previously referenced by the same variable.  
>>>>
>>>> Any help on this matter would be very much appreciated. 
>>>>
>>>> greetings, 
>>>>
>>>> Noc2
>>> -- 
>>>
>>> Syscon Ingenieurbüro für Meß- und Datentechnik GmbH
>>> Ralf Joachim
>>> Raiffeisenstraße 11
>>> 72127 Kusterdingen
>>> Germany
>>>
>>> Tel.   +49 7071 3690 52
>>> Mobil: +49 173 9630135
>>> Fax    +49 7071 3690 98
>>>
>>> Internet: www.syscon.eu
>>> E-Mail: [EMAIL PROTECTED]
>>>
>>> Sitz der Gesellschaft: D-72127 Kusterdingen
>>> Registereintrag: Amtsgericht Stuttgart, HRB 382295
>>> Geschäftsleitung: Jens Joachim, Ralf Joachim
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe from this list please visit:
>>>
>>>     http://xircles.codehaus.org/manage_email
>>>
>>>
>>>
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe from this list please visit:
> 
>     http://xircles.codehaus.org/manage_email
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Sql-timestamp-type-and-the-castor-cache-timestamp-tp14370195p14414251.html
Sent from the Castor - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe from this list please visit:

    http://xircles.codehaus.org/manage_email

Reply via email to