You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Laurie Harper <zo...@holoweb.net> on 2004/03/19 03:12:22 UTC

Object insertion semantics

What are the expected semantics for object insertion? I'm a bit confused 
by what I'm seeing here :) Here's some sample code:

     Player p1 = null, p2 = null, p3 = null;

     Implementation odmg = OJB.getInstance();
     Database db = odmg.newDatabase();
     db.open("repository.xml", Database.OPEN_READ_ONLY);

     try {
         System.out.println("insert p1 (pre-existing)");
         p1 = new Player("name1", "player11", "pwd");
         Transaction txn = odmg.newTransaction();
         txn.begin();
         txn.lock(p1, Transaction.WRITE);
         System.out.println("commit");
         txn.commit();
         System.out.println("ok");
     } catch (Throwable t) {
         System.out.println("got a "+t.getClass().getName());
     }

     try {
         System.out.println("insert p2 (new)");
         Transaction txn = odmg.newTransaction();
         txn.begin();
         p2 = new Player("name3", "player3", "pwd");
         txn.lock(p2, Transaction.WRITE);
         System.out.println("insert p2 (again)");
         p3 = new Player("name3", "player3", "pwd");
         txn.lock(p3, Transaction.WRITE);
         System.out.println("commit");
         txn.commit();
         System.out.println("ok");
     } catch (Throwable t) {
         System.out.println("got a "+t.getClass().getName());
         t.printStackTrace();
     }

     System.out.println("clean-up");
     try {
         Transaction txn = odmg.newTransaction();
         txn.begin();
         db.deletePersistent(p2);
         txn.commit();
     } catch (Throwable t) {
         System.out.println("got a "+t.getClass().getName());
     }

     db.close();
}

Assume player1 exists and player3 doesn't. I'm getting several surprises 
with this.

First, the insertion of player1 fails, as it should. But I expected it 
to fail on the call to lock(). It doesn't fail until the commit() at 
which point I get a org.apache.ojb.odmg.TransactionAbortedExceptionOJB. 
Is this the expected behaviour?

Next, the insertion of player3. This succeeds. What I was expecting was 
an error on the second call to lock(). I could see it failing in 
commit() instead for consistency with what I saw on player1, but it 
ought to fail somewhere shouldn't it?

Finally, the call to deletePersistent is having no effect. I'm unable to 
delete objects after I insert them. Am I doing something wrong or is 
this an OJB bug?

I suspect some or all of these problems may be to do with OJB's primary 
key handling. I'm using database native sequences and OJB seems not to 
cope with that correctly, going on the SQL statements P6Spy is reporting:

1079658237422|1|0|statement|SELECT password,email,name,ID FROM PLAYER 
WHERE ID = ? |SELECT password,email,name,ID FROM PLAYER WHERE ID = ''
[from the first call to lock() on player3; the second call generates no SQL]

1079658237473|2|0|statement|DELETE FROM PLAYER WHERE ID = ? |DELETE FROM 
PLAYER WHERE ID = ''
[on the call to deletePersistent, which explains why it's not doing much]

ID is an anonymous property on Player; could that be a factor? Here's 
the repository entry for the class:

<class-descriptor
     class="net.holoweb.ff1.domain.om.game.Player"
     table="PLAYER"
 >
     <field-descriptor
         name="ID"
         column="ID"
         jdbc-type="INTEGER"
         primarykey="true"
         nullable="false"
         indexed="true"
         access="anonymous"
     >
     </field-descriptor>
     <field-descriptor
         name="name"
         column="name"
         jdbc-type="VARCHAR"
         nullable="false"
         length="64"
     >
     </field-descriptor>
     <field-descriptor
         name="email"
         column="email"
         jdbc-type="VARCHAR"
         nullable="false"
         length="64"
     >
     </field-descriptor>
     <field-descriptor
         name="password"
         column="password"
         jdbc-type="VARCHAR"
         nullable="false"
         length="64"
     >
     </field-descriptor>
     <index-descriptor
         name="IDX_PLAYER_1"
         unique="true"
     >
         <index-column name="email"/>
     </index-descriptor>
</class-descriptor>

If you need more info to diagnose what's going on, let me know.

L.



---------------------------------------------------------------------
To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-user-help@jakarta.apache.org


Re: Object insertion semantics

Posted by Laurie Harper <zo...@holoweb.net>.
Oops, wrong list; please ignore! :)

L.

Laurie Harper wrote:

> What are the expected semantics for object insertion? I'm a bit confused 
> by what I'm seeing here :) Here's some sample code:
> 
>     Player p1 = null, p2 = null, p3 = null;
> 
>     Implementation odmg = OJB.getInstance();
>     Database db = odmg.newDatabase();
>     db.open("repository.xml", Database.OPEN_READ_ONLY);
> 
>     try {
>         System.out.println("insert p1 (pre-existing)");
>         p1 = new Player("name1", "player11", "pwd");
>         Transaction txn = odmg.newTransaction();
>         txn.begin();
>         txn.lock(p1, Transaction.WRITE);
>         System.out.println("commit");
>         txn.commit();
>         System.out.println("ok");
>     } catch (Throwable t) {
>         System.out.println("got a "+t.getClass().getName());
>     }
> 
>     try {
>         System.out.println("insert p2 (new)");
>         Transaction txn = odmg.newTransaction();
>         txn.begin();
>         p2 = new Player("name3", "player3", "pwd");
>         txn.lock(p2, Transaction.WRITE);
>         System.out.println("insert p2 (again)");
>         p3 = new Player("name3", "player3", "pwd");
>         txn.lock(p3, Transaction.WRITE);
>         System.out.println("commit");
>         txn.commit();
>         System.out.println("ok");
>     } catch (Throwable t) {
>         System.out.println("got a "+t.getClass().getName());
>         t.printStackTrace();
>     }
> 
>     System.out.println("clean-up");
>     try {
>         Transaction txn = odmg.newTransaction();
>         txn.begin();
>         db.deletePersistent(p2);
>         txn.commit();
>     } catch (Throwable t) {
>         System.out.println("got a "+t.getClass().getName());
>     }
> 
>     db.close();
> }
> 
> Assume player1 exists and player3 doesn't. I'm getting several surprises 
> with this.
> 
> First, the insertion of player1 fails, as it should. But I expected it 
> to fail on the call to lock(). It doesn't fail until the commit() at 
> which point I get a org.apache.ojb.odmg.TransactionAbortedExceptionOJB. 
> Is this the expected behaviour?
> 
> Next, the insertion of player3. This succeeds. What I was expecting was 
> an error on the second call to lock(). I could see it failing in 
> commit() instead for consistency with what I saw on player1, but it 
> ought to fail somewhere shouldn't it?
> 
> Finally, the call to deletePersistent is having no effect. I'm unable to 
> delete objects after I insert them. Am I doing something wrong or is 
> this an OJB bug?
> 
> I suspect some or all of these problems may be to do with OJB's primary 
> key handling. I'm using database native sequences and OJB seems not to 
> cope with that correctly, going on the SQL statements P6Spy is reporting:
> 
> 1079658237422|1|0|statement|SELECT password,email,name,ID FROM PLAYER 
> WHERE ID = ? |SELECT password,email,name,ID FROM PLAYER WHERE ID = ''
> [from the first call to lock() on player3; the second call generates no 
> SQL]
> 
> 1079658237473|2|0|statement|DELETE FROM PLAYER WHERE ID = ? |DELETE FROM 
> PLAYER WHERE ID = ''
> [on the call to deletePersistent, which explains why it's not doing much]
> 
> ID is an anonymous property on Player; could that be a factor? Here's 
> the repository entry for the class:
> 
> <class-descriptor
>     class="net.holoweb.ff1.domain.om.game.Player"
>     table="PLAYER"
>  >
>     <field-descriptor
>         name="ID"
>         column="ID"
>         jdbc-type="INTEGER"
>         primarykey="true"
>         nullable="false"
>         indexed="true"
>         access="anonymous"
>     >
>     </field-descriptor>
>     <field-descriptor
>         name="name"
>         column="name"
>         jdbc-type="VARCHAR"
>         nullable="false"
>         length="64"
>     >
>     </field-descriptor>
>     <field-descriptor
>         name="email"
>         column="email"
>         jdbc-type="VARCHAR"
>         nullable="false"
>         length="64"
>     >
>     </field-descriptor>
>     <field-descriptor
>         name="password"
>         column="password"
>         jdbc-type="VARCHAR"
>         nullable="false"
>         length="64"
>     >
>     </field-descriptor>
>     <index-descriptor
>         name="IDX_PLAYER_1"
>         unique="true"
>     >
>         <index-column name="email"/>
>     </index-descriptor>
> </class-descriptor>
> 
> If you need more info to diagnose what's going on, let me know.
> 
> L.



---------------------------------------------------------------------
To unsubscribe, e-mail: struts-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: struts-user-help@jakarta.apache.org