You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-user@db.apache.org by Joose Vettenranta <jo...@iki.fi> on 2004/07/22 09:40:41 UTC

Foreignkey problem

Hi,

using db-ojb-1.0.rc6.jar and jdo 1.0.1

I'm trying to make simple thing to work. But it seems to just  add  
those in wrong order and causes referency error. I've been googling and  
trying different configurations but only thing I get is different error  
message.

Questin is, how to get this thing to work?

Database get's this much:

Jul 22 10:29:45 cellula postgres[31986]: [18] LOG:  query: begin;
Jul 22 10:29:45 cellula postgres[31986]: [19] LOG:  query: select  
nextval('file_categories_id_seq')
Jul 22 10:29:45 cellula postgres[31986]: [20] LOG:  query: select  
nextval('category_names_id_seq')
Jul 22 10:29:45 cellula postgres[31986]: [21] LOG:  query: SELECT 1
Jul 22 10:29:45 cellula postgres[31986]: [22] LOG:  query: rollback;  
begin;
Jul 22 10:29:45 cellula postgres[31986]: [23] LOG:  query: SELECT 1
Jul 22 10:29:45 cellula postgres[31986]: [24] LOG:  query: end


With this setup I get this error message:

org.apache.ojb.jdori.sql.OjbStoreFatalInternalException:  
org.apache.ojb.jdori.sql.OjbStoreManager.insert NestedThrowables:  
org.apache.ojb.broker.metadata.MetadataException: Can't find member  
'file_categories' in net.vettenranta.category.bean.CategoryName
....
Caused by: org.apache.ojb.broker.metadata.MetadataException: Can't find  
member 'file_categories' in net.vettenranta.category.bean.CategoryName
....
Caused by: java.lang.NoSuchFieldException: file_categories
.....
NestedThrowablesStackTrace:
org.apache.ojb.broker.metadata.MetadataException: Can't find member  
'file_categories' in net.vettenranta.category.bean.CategoryName
.............
Caused by: java.lang.NoSuchFieldException: file_categories
.......


I have (in postgresql) tables:
--------------
create table file_categories (
  id serial,
  parent integer not null,
primary key(id),
foreign key(parent) references file_categories (id));

create table category_names (
  id serial,
  category_id integer not null,
  lang_id integer not null,
  name varchar(50),
primary key(id),
foreign key(category_id) references file_categories(id));
--------------

repository.xml:
--------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE descriptor-repository PUBLIC "-//Apache Software  
Foundation//DTD OJB Repository//EN" "repository.dtd">
<descriptor-repository version="1.0" isolation-level="read-uncommitted">
   <jdbc-connection-descriptor jcd-alias="filestore"  
default-connection="true" platform="PostgreSQL"  
subprotocol="postgresql">
     <sequence-manager  
className="org.apache.ojb.broker.util.sequence.SequenceManagerNextValImp 
l"/>
   </jdbc-connection-descriptor>
   <class-descriptor class="net.vettenranta.category.bean.Category"  
table="file_categories">
     <field-descriptor name="id" jdbc-type="INTEGER" primarykey="true"  
default-fetch="true" access="readonly" indexed="true"  
autoincrement="true" sequence-name="file_categories_id_seq" column="id"  
nullable="false"/>
     <field-descriptor name="parent" column="parent"  
default-fetch="true" jdbc-type="INTEGER"/>
     <collection-descriptor name="names"  
element-class-ref="net.vettenranta.category.bean.CategoryName"
auto-retrieve="true"
auto-update="false"
auto-delete="true">
       <inverse-foreignkey field-ref="category"/>
     </collection-descriptor>

   </class-descriptor>

   <class-descriptor class="net.vettenranta.category.bean.CategoryName"  
table="category_names">
     <field-descriptor name="id" jdbc-type="INTEGER" primarykey="true"  
default-fetch="true" access="readonly" indexed="true"  
autoincrement="true" sequence-name="category_names_id_seq" column="id"  
nullable="false"/>
     <field-descriptor name="name" column="name" default-fetch="true"  
jdbc-type="VARCHAR"/>
     <field-descriptor name="lang" column="lang_id" jdbc-type="INTEGER"  
default-fetch="true"/>
     <field-descriptor name="name" nullable="false" default-fetch="true"  
column="category_id" jdbc-type="INTEGER" />
<!---
I have also tried reference-descriptor name="category"  
class-ref="net.vettenranta.category.bean.Category" -> Error message:

org.apache.ojb.jdori.sql.OjbStoreFatalInternalException:  
org.apache.ojb.jdori.sql.OjbStoreManager.insert NestedThrowables:  
org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException:  
java.lang.Integer not found in OJB Repository

if reference descriptor is removed, then it's going to do inserting in  
wrong order, like this:
insert into category_names;
insert into file_categories;

which causes error in SQL-server because name was entered with  
category_id which is not present in file_categories!

-->
     <reference-descriptor name="file_categories"  
class-ref="net.vettenranta.category.bean.Category"
refresh="true"
auto-retrieve="true"
auto-update="true"
auto-delete="true">
      <foreignkey field-ref="category" />
     </reference-descriptor>
  </class-descriptor>
</descriptor-repository>
--------------

package.jdo:
--------------
<jdo>

  <package name="net.vettenranta.category.bean">
     <class name="Category" identity-type="datastore">
             <extension vendor-name="ojb" key="table"  
value="file_categories"/>
             <field name="id" persistence-modifier="persistent">
                 <extension vendor-name="ojb" key="column" value="id"/>
             </field>
             <field name="parent" persistence-modifier="persistent">
                 <extension vendor-name="ojb" key="column"  
value="parent"/>
             </field>
             <field name="names">
              <collection element-type="CategoryName">
               <extension vendor-name="ojb" key="inverse" value="id" />
              </collection>
             </field>
           </class>
          <class name="CategoryName" identity-type="datastore">
             <extension vendor-name="ojb" key="table"  
value="category_names"/>
             <field name="id" persistence-modifier="persistent">
                 <extension vendor-name="ojb" key="column" value="id"/>
             </field>
             <field name="lang" persistence-modifier="persistent">
                 <extension vendor-name="ojb" key="column"  
value="lang_id"/>
             </field>
             <field name="category" persistence-modifier="persistent">
                 <extension vendor-name="ojb" key="column"  
value="category_id"/>
             </field>
             <field name="name" persistence-modifier="persistent">
                 <extension vendor-name="ojb" key="column" value="name"/>
             </field>
           </class>
  </package>
</jdo>
--------------

Category.java:
--------------
public class Category implements Serializable {
         protected int parent;
         private int id;
         private Collection names = new ArrayList();

         public Category () {
                 parent = 0;
         }

         public void setId (int id) { this.id = id; }
         public int getId () { return this.id; }

         public void setParent (int parent) {
                 this.parent = parent;
         }

         public int getParent () {
                 return this.parent;
         }

         public void setNames (Collection names) {
                 this.names = names;
         }

         public void addNames (CategoryName name) {
                 names.add (name);
         }

         public Collection getNames() {
                 return this.names;
         }
}

--------------

CategoryName.java:
--------------
public class CategoryName implements Serializable {
         private int id;
         private String name;
         private int lang;
         private int category;

         public CategoryName () {
                 this.lang=1;
         }

         public int getId () { return id; }
         public String getName () { return name; }
         public int getLang () { return lang; }
         public int getCategory () {
                 return this.category;
         }

         public void setId (int id) { this.id = id; }
         public void setLang (int lang) { this.lang = lang; }
         public void setName (String name) { this.name = name; }
         public void setCategory (int category) {
                 this.category = category;
         }
}
--------------

--
"Always remember that you are unique, just like everyone else!"
* http://iki.fi/joose/ * joose@iki.fi * +358 44 561 0270 *


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