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 |
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.
|