Hi Adam,

Adam Brons wrote:
Hey Everyone,

I have a question about mapping inheritance.

What I'm having trouble doing is reading and updating a collection of a subclasses. It writes the Manager entry with the Manager => Employee mapping without problem. Unfortunately when I read in the Company class and it loads a collection of employees it does not collect the Manager => Employee mapping. Based on the method of Inheritance I used I was under the impression that OJB would use the class listed in ojbConcreteClass (class_name) as the class to load the data into, and since that class in some cases is a Manager, it should load and populate the Manager's Collection of Employees.

Any help you can offer would be most appreciated. Thank!


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]

Reply via email to