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
>
>
>
--
View this message in context:
http://www.nabble.com/Sql-timestamp-type-and-the-castor-cache-timestamp-tp14370195p14412490.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