I'm having trouble getting a fairly simple M:N relationship working. Here's the basic setup.

Table: authors
id: integer
first_name: varchar
last_name: varchar

Table: books
isbn: varchar
title: varchar

Table: books_authors
book_isbn: varchar
author_id: integer

So this is a relationship that goes both ways; A single book can have multiple authors, and an author can relate to several books.

My classes are as you'd expect; Book has get/setTitle(), get/setIsbn (), and get/setAuthors(). Author has get/setId(), get/setFirstName(), get/setLastName(), and get/setBooks(). Both use Lists for the collections of authors/books.

Here's my mapping file, where I believe the problem lies:

<mapping>
  <class name="ibm.xml.castor.Book" identity="isbn">
    <map-to table="dw_books"/>
    <field name="isbn" type="string">
      <sql name="isbn" type="varchar" />
    </field>
    <field name="title" type="string">
      <sql name="title" type="varchar" />
    </field>
    <field name="authors" type="ibm.xml.castor.Author"
           collection="arraylist" required="true">
      <sql name="author_id"
           many_table="dw_books_authors"
           many_key="book_isbn" />
    </field>
  </class>

  <class name="ibm.xml.castor.Author" identity="id">
    <map-to table="dw_authors" />
    <field name="id" type="int">
      <sql name="id" type="integer" />
    </field>
    <field name="firstName" type="string">
      <sql name="first_name" type="varchar" />
    </field>
    <field name="lastName" type="string">
      <sql name="last_name" type="varchar" />
    </field>
    <field name="books" type="ibm.xml.castor.Book"
           collection="arraylist" required="true">
      <sql name="book_isbn"
           many_table="dw_books_authors"
           many_key="author_id" />
    </field>
  </class>
</mapping>

If I create a new Book/Author combination, like this:

      Database database = jdoManager.getDatabase();
      database.begin();
      Author author = new Author(1001, "Joseph", "Conrad");
      Book book = new Book("1892295490", "Heart of Darkness", author);
      database.create(book);

--then I get an error like this:

A fatal error occurred while creating/updating ibm.xml.castor.Book using SQL: INSERT INTO dw_books (isbn,title,author_id) VALUES (?,?,?)

For reasons I can't figure out (I've been working on this for about three hours now), Castor thinks that the field defined as a many-to- many field -- author_id in the books_authors table -- is actually in the books table. I've worked through the JDO examples from Castor, as well as the online docs, and I can't find a single thing I'm doing wrong, which of course means it's something quite obvious.

Any help would be really great. BTW, here's the more complete test program, in case there's something about how you create an entry in an M:N situation that's different from how you create one normally...

      JDOManager.loadConfiguration("jdo-conf.xml");
      JDOManager jdoManager = JDOManager.createInstance("bmclaugh");

      Database database = jdoManager.getDatabase();
      database.begin();
      Author author = new Author(1001, "Joseph", "Conrad");
      Book book = new Book("1892295490", "Heart of Darkness", author);
      database.create(book);
      database.commit();
      database.close();

Thanks; I was able to create an Author or Book in the database when I removed the M:N stuff, but of course then my data's all out of whack.

Thanks
---
Brett McLaughlin
Series Editor, Head First
O'Reilly Media, Inc.

Phone: (972) 722-6252
Fax:      (972) 692-7958
E-Mail: [EMAIL PROTECTED]


Reply via email to