Hello again,

I found the problem myself.  It actually was a bug in the OJB class
"org.apache.ojb.broker.metadata.AnonymousPersistentFieldHelper" and it
has already been fixed for the next release (in version 1.8 of the class
file in the OJB CVS).  

In method "computeInheritedPersistentFields", fields where not computed
as "inherited persistent fields" if they were primary keys.  This
if-clause has been completely removed.

A new version seems to be released in a few days.

Sven



-----Original Message-----
From: Sven Woltmann [mailto:[EMAIL PROTECTED] 
Sent: Donnerstag, 29. Juli 2004 02:00
To: [EMAIL PROTECTED]
Subject: Problem (Bug?): Inheritance / Mapping Classes on Multiple
Joined Tables / Primary Key is _NOT_ auto-increment

Hello,

I have a problem with an inheritance hierarchy, mapped on multiple
joined tables, where the primary key is _not_ auto-increment.  The
problem is:  OJB always stores "0" as the value for the primary key
field, although I defined another value.

--------

To make this easily reproducable, I created the tables from the OJB
guide example:

    CREATE TABLE a (
           id INT NOT NULL,
           some_value_from_a INT,
           PRIMARY KEY (id)
    )TYPE=InnoDB;
    
    CREATE TABLE b (
           id INT NOT NULL,
           some_value_from_b INT,
           PRIMARY KEY (id),
           INDEX (id),
           CONSTRAINT fk_b_a FOREIGN KEY (id)
                      REFERENCES a (id)
    )TYPE=InnoDB;
    
--------

    The classes A and B are defined as follows:

    public class A
    {
        private int id;
        private int someValueFromA;
        // getters and setters...
    }
    
    public class B extends A
    {
        private int id; // actually this field is not 
                        // necessary,  it makes no difference 
                        // to the result if it is there or not
        private int someValueFromB;
        // getters and setters...
    }
    
--------

repository_user.xml defines:

    <class-descriptor
        class="A" 
        table="a"
    >
        <field-descriptor 
            name="id" 
            column="id" 
            jdbc-type="INTEGER" 
            primarykey="true"
        />
        <field-descriptor 
            name="someValueFromA"
            column="some_value_from_a" 
            jdbc-type="INTEGER" 
        />
    </class-descriptor>
    
    <class-descriptor
        class="B" 
        table="b"
    >
        <field-descriptor 
            name="id" 
            column="id" 
            jdbc-type="INTEGER" 
            primarykey="true"
        />
        <field-descriptor 
            name="someValueFromB"
            column="some_value_from_b" 
            jdbc-type="INTEGER" 
        />
        <reference-descriptor name="super"
            class-ref="A" 
            auto-retrieve="true" 
            auto-update="true"
            auto-delete="true" 
        >
            <foreignkey field-ref="id"/>
        </reference-descriptor>
    </class-descriptor>

--------

All this is exactly as in the OJB reference guide - except that the
primary key is _not_ auto-increment (if it _is_ auto-increment,
everything works fine).

I try to create an instance of B and store it:

    B b = new B();
    b.setId(55);
    b.setSomeValueFromA(10);
    b.setSomeValueFromB(20);
        
    broker.store(b);

After the first run, I check the database and I find out that both
records, A and B, have been stored (which means that OJB has understood
that A is a base class of B), but both records have an ID of 0 (zero):

    mysql> select * from a;
    +-----+-------------------+
    | id  | some_value_from_a |
    +-----+-------------------+
    |   0 |                10 |
    +-----+-------------------+
    1 row in set (0.00 sec)
    
    mysql> select * from b;
    +-----+-------------------+
    | id  | some_value_from_b |
    +-----+-------------------+
    |   0 |                20 |
    +-----+-------------------+
    1 row in set (0.00 sec)

Consequently, when executing the code a second time, I get:

    "Duplicate entry '0' for key 1"

This is what my database query log says about it:

First run:
    SELECT id FROM accountingbase.b WHERE id = 55
    INSERT INTO accountingbase.a (id,some_value_from_a) VALUES (0,10)
    INSERT INTO accountingbase.b (id,some_value_from_b) VALUES (0,20)

Second run:
    SELECT id FROM accountingbase.b WHERE id = 55
    INSERT INTO accountingbase.a (id,some_value_from_a) VALUES (0,10)
    ==> "Duplicate entry '0' for key 1"

So, first it checks if no record with ID 55 exists.  And then it tries
to insert a record, but with the ID 0.  So what has happened in between?
How did my 55 become a 0?  Is this a bug in OJB?

Has anyone ever had the same problem?  Can someone help me here?

Thanks in advance and best regards,
Sven

P.S.: I am using OJB version 1.0.0 (final)


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to