Adam Brons wrote:
Thanks for the response Armin. What you mentioned may be right, but either case isn't what I'm wanting.

The scenario that I'm trying to solve is this:

        1 database table Employee and Manager
The MANAGER_EMPLOYEE_MAP is a mapping table for an additional collection that the Manager class has (aka a list of employee's s/he's responsible for). This just points BACK to the employee table.

You use a discriminator column to identify the real class (used in "table per class"), but in your posted database table script it seems you expect a "table per subclass" mapping.
Yes I added the ojbConcreteClass column to identify the real class, because what I want to happen is that when loading the Company class collection (as defined in the repository configuration) it will use the objConcreteClass specified class. So the Company class would contain a collection of Employee and Manager classes.


Which version of OJB do you use?
I modify/extend a test of OJB's test-suite to reproduce your problem - without success, the test pass (I use latest version from SVN, OJB_1_0_RELEASE branch).

Think the test is very similar to your problem (maybe more complicated then your scenario):

The mapping
-----------

<class-descriptor
          class="org.apache.ojb.broker.ProductGroup"
          proxy="org.apache.ojb.broker.ProductGroupProxy"
          table="Kategorien"
   >
...
<collection-descriptor
         name="allArticlesInGroup"
         element-class-ref="org.apache.ojb.broker.AbstractArticle"
         auto-retrieve="true"
         auto-update="true"
         auto-delete="false"
      >
         <orderby name="articleId" sort="DESC"/>

         <inverse-foreignkey field-ref="productGroupId"/>
      </collection-descriptor>

....
</class-descriptor>


<class-descriptor
          class="org.apache.ojb.broker.Article"
          proxy="dynamic"
          table="Artikel"
   >
      <extent-class class-ref="org.apache.ojb.broker.BookArticle" />
      <extent-class class-ref="org.apache.ojb.broker.AbstractCdArticle" />
      <field-descriptor
         name="articleId"
         column="Artikel_Nr"
         jdbc-type="INTEGER"
         primarykey="true"
         autoincrement="true"
      />
....
</class-descriptor>


<class-descriptor
          class="org.apache.ojb.broker.BookArticle"
          table="BOOKS"
   >
      <field-descriptor
         name="articleId"
         column="Artikel_Nr"
         jdbc-type="INTEGER"
         primarykey="true"
         autoincrement="true"
      />
....
</class-descriptor>


<class-descriptor class="org.apache.ojb.broker.AbstractCdArticle">
      <extent-class class-ref="org.apache.ojb.broker.CdArticle" />
</class-descriptor>


<class-descriptor
          class="org.apache.ojb.broker.CdArticle"
          table="CDS"
   >
      <field-descriptor
         name="articleId"
         column="Artikel_Nr"
         jdbc-type="INTEGER"
         primarykey="true"
         autoincrement="true"
      />

....
</class-descriptor>


The test
--------

public void testCollectionRetrieval() throws Exception
{
...
ProductGroup group=(ProductGroup) broker.getObjectByQuery(....

    // expect 7 Article, 2 Books, 3 Cds
    assertEquals("check size",group.getAllArticles().size(),12);
    List articles = group.getAllArticles();
    int countArticle = 0;
    int countBook = 0;
    int countCD = 0;
    for(int i = 0; i < articles.size(); i++)
    {
        Object o =  articles.get(i);
        //System.out.println("Result: " + o);
        if(o instanceof Article)
        {
            countArticle++;
        }
        if(o instanceof BookArticle)
        {
            countBook++;
        }
        if(o instanceof CdArticle)
        {
            countCD++;
        }
    }
    // all objects are instance of Article
    assertEquals(12, countArticle);
    assertEquals(2, countBook);
    assertEquals(3, countCD);
}

regards,
Armin






Armin Waibel <[EMAIL PROTECTED]> 03/06/07 02:29 PM
Please respond to
"OJB Users List" <ojb-user@db.apache.org>


To
OJB Users List <ojb-user@db.apache.org>
cc

Subject
Re: Inheritance Mapping





I think you mixed up two different inheritance strategies.

table per class
file:///E:/dev/db-ojb-1b/ojb/doc/docu/guides/advanced-technique.html#Mapping+Each+Class+of+a+Hierarchy+to+a+Distinct+Table+%28table+per+class%29


table per subclass
file:///E:/dev/db-ojb-1b/ojb/doc/docu/guides/advanced-technique.html#Mapping+Each+Subclass+to+a+Distinct+Table+%28table+per+subclass%29


You use a discriminator column to identify the real class (used in "table per class"), but in your posted database table script it seems you expect a "table per subclass" mapping.
Could this be the issue?

regards,
Armin


The following is an EXAMPLE of what I'm trying to do.

Classes --- Based on documentation examples:
==================================
public class Company {
        private Integer id;
        private Collection<Employee> employees;
        private String name;

        public Company() { }

        public Integer getId() {
                return id;
        }
        public void setId(Integer id) {
                this.id = id;
        }
        public Collection<Employee> getEmployees() {
if (employees == null) employees = new ArrayList();

                return employees;
        }
        public void setEmployees(Collection<Employee> employees) {
                this.employees = employees;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
}

public class Employee {
        protected Integer id;
        protected Integer companyId;
        protected String name;
        protected String ojbConcreteClass;

public Employee() { this.ojbConcreteClass = this.getClass().getName(); }

        public Integer getId() {
                return id;
        }
        public void setId(Integer id) {
                this.id = id;
        }
        public Integer getCompanyId() {
                return companyId;
        }
        public void setCompanyId(Integer companyId) {
                this.companyId = companyId;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public String getOjbConcreteClass() {
                return ojbConcreteClass;
        }
        public void setOjbConcreteClass(String ojbConcreteClass) {
                this.ojbConcreteClass = ojbConcreteClass;
        }
}

public class Manager extends Employee {
        private Collection<Employee> employees;

        public Manager() { super(); }

        public Collection<Employee> getEmployees() {
if (employees == null) employees = new ArrayList();

                return employees;
        }
        public void setEmployees(Collection<Employee> employees) {
                this.employees = employees;
        }
}

Database(DB2) tables:
================
CREATE TABLE company (
company_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1

INCREMENT BY 1),
  name varchar(255) NOT NULL,
--
  PRIMARY KEY (company_id)
);

CREATE TABLE employee (
employee_id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH
1
INCREMENT BY 1),
  name varchar(255) NOT NULL,
  company_id_FK INTEGER NOT NULL,
  class_name varchar(255) NOT NULL,
--
PRIMARY KEY (employee_id), FOREIGN KEY (company_id_FK) REFERENCES company (company_id)
);

CREATE TABLE manager_employee_map (
  manager_id_FK INTEGER NOT NULL,
  employee_id_FK INTEGER NOT NULL,
--
  FOREIGN KEY (manager_id_FK) REFERENCES employee (employee_id),
  FOREIGN KEY (employee_id_FK) REFERENCES employee (employee_id)
);

Repository mapping:
===============
<class-descriptor class="Company" table="COMPANY">
<field-descriptor name="id" column="COMPANY_ID" jdbc-type="INTEGER"
          primarykey="true" autoincrement="true" access="readonly"/>
<field-descriptor name="name" column="NAME" jdbc-type="VARCHAR"
/>
        <collection-descriptor name="employees"
        element-class-ref="Employee"
auto-delete="true" auto-update="true" auto-insert="true" auto-retrieve="true">
        <inverse-foreignkey field-ref="CompanyId"/>
    </collection-descriptor>
</class-descriptor>

<class-descriptor class="Employee" table="employee"> <extent-class class-ref="Manager"/> <field-descriptor name="id" column="EMPLOYEE_ID" jdbc-type="INTEGER"
         primarykey="true" autoincrement="true" access="readonly"/>
<field-descriptor name="name" column="NAME" jdbc-type="VARCHAR"
/>
<field-descriptor name="companyId" column="COMPANY_ID_FK" jdbc-type="INTEGER"/> <field-descriptor name="ojbConcreteClass" column="CLASS_NAME" jdbc-type="VARCHAR" />
</class-descriptor>

<class-descriptor class="Manager" table="employee"> <field-descriptor name="id" column="EMPLOYEE_ID" jdbc-type="INTEGER"
         primarykey="true" autoincrement="true" access="readonly"/>
<field-descriptor name="name" column="NAME" jdbc-type="VARCHAR"
/>
<field-descriptor name="companyId" column="COMPANY_ID_FK" jdbc-type="INTEGER"/> <field-descriptor name="ojbConcreteClass" column="CLASS_NAME" jdbc-type="VARCHAR" />

        <collection-descriptor name="employees"
         element-class-ref="Employee"
         auto-retrieve="true" auto-update="true" auto-delete="true"
         indirection-table="MANAGER_EMPLOYEE_MAP">
                <fk-pointing-to-this-class column="MANAGER_ID_FK"/>
                <fk-pointing-to-element-class column="EMPLOYEE_ID_FK"/>
</collection-descriptor> </class-descriptor>


Adam Brons

---------------------------------------------------------------------
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