Reviews :

Mapping Java Objects to a Database with Castor-JDO:

Handling many-to-many relations

Lets' add a many-to-many relation to the object model by introducing the Actor object:

Again we'll go through the steps of adding this relation to the Java model, the database, and the Castor setup.

A. Java classes

The Actor class looks like this:

package hansen.playground;

import java.util.*;

public class Actor {

  private int id;
  private String name;
  private Collection movies = new ArrayList();
  
  public Actor() {}
  public Actor(int id, String name) { this.id = id;
                                      this.name = name;}
  
  public int getId() { return id; }
  public void setId(int id) { this.id = id; }

  public String getName() { return name; }
  public void setName(String name) { this.name = name; }

  public Collection getMovies() { return movies; }
  public void setMovies(Collection movies) { 
    this.movies = movies; 
  }
  
  public void addMovie(Movie movie) {
    movies.add(movie);
  }
  
}

- Listing 6: The Actor class -

The addMovie method simplifies adding a movie to an actor.  

In Movie we must add a Collection for the actors:

private Collection actors = new ArrayList();
public Collection getActors() { return actors; }
public void setActors(Collection actors) { 
  this.actors = actors; 
}

public void addActor(Actor actor) {
  actors.add(actor);
} 

B. Database tables 

Create the actor table:

CREATE TABLE actor (
  id int NOT NULL,
  name varchar(100),
  PRIMARY KEY (id)
) 

A many-to-many relation is normally handled by making a new table, the bridge table, that holds the two foreign keys for the two tables. For this purpose we therefore create the actor_movie table:

  CREATE TABLE actor_movie (
  id_actor int NOT NULL,
  id_movie int NOT NULL,
  PRIMARY KEY  (id_actor,id_movie)
) 

C. The mappings file 

Modify the mapping.xml file: 

<class name="hansen.playground.Movie" identity="id">
    <map-to table="movie" />
    . . .
    <field name="actors" type="hansen.playground.Actor" collection="collection">
      <sql name="id_actor" many-table="actor_movie" many-key="id_movie" />
    </field>
  </class>

  <class name="hansen.playground.Actor" identity="id">
    <map-to table="actor" />
    <field name="id" type="integer">
      <sql name="id" type="integer"/>
    </field>
    <field name="name" type="string">
      <sql name="name" type="varchar" />
    </field>
    <field name="movies" type="hansen.playground.Movie" collection="collection">
      <sql name="id_movie" many-table="actor_movie" many-key="id_actor" />
    </field>
  </class>

As you can see the many-to-many case is handled by three attributes in the sql element:

  • many-table: the name of the bridge table
  • name: the field in the bridge table that has the key to the other object
  • many-key: as for the "one-to-many" situation, this is the name of the field that has the key to ourselves  

D. Test the setup

Let's assume that we now have these three movies in the movie table:

id
id_media
title
11
1
The Matrix
12
1
Lord of the Rings
13
2
Chain Reaction

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.