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]