The roster Application - The Java EE 5 Tutorial (original) (raw)
2. Using the Tutorial Examples
3. Getting Started with Web Applications
5. JavaServer Pages Technology
7. JavaServer Pages Standard Tag Library
10. JavaServer Faces Technology
11. Using JavaServer Faces Technology in JSP Pages
12. Developing with JavaServer Faces Technology
13. Creating Custom UI Components
14. Configuring JavaServer Faces Applications
15. Internationalizing and Localizing Web Applications
16. Building Web Services with JAX-WS
17. Binding between XML Schema and Java Classes
19. SOAP with Attachments API for Java
21. Getting Started with Enterprise Beans
23. A Message-Driven Bean Example
24. Introduction to the Java Persistence API
25. Persistence in the Web Tier
26. Persistence in the EJB Tier
Entity Relationships in the order Application
Self-Referential Relationships
One-to-Many Relationship Mapped to Overlapping Primary and Foreign Keys
Primary Keys in the order Application
Entity Mapped to More Than One Database Table
Cascade Operations in the order Application
BLOB and CLOB Database Types in the order Application
Temporal Types in the order Application
Managing the order Application's Entities
Building and Running the order Application
Creating the Database Tables in NetBeans IDE
Creating the Database Tables Using Ant
Building, Packaging, Deploying, and Running order In NetBeans IDE
Building, Packaging, Deploying, and Running order Using Ant
27. The Java Persistence Query Language
28. Introduction to Security in the Java EE Platform
29. Securing Java EE Applications
31. The Java Message Service API
32. Java EE Examples Using the JMS API
36. The Coffee Break Application
37. The Duke's Bank Application
The roster Application
The roster application maintains the team rosters for players in recreational sports leagues. The application has four components: Java Persistence API entities (Player, Team, and League), a stateful session bean (RequestBean), an application client (RosterClient), and three helper classes (PlayerDetails,TeamDetails, and LeagueDetails).
Functionally, roster is similar to the order application described earlier in this chapter with three new features that order does not have: many-to-many relationships, entity inheritance, and automatic table creation at deploytime.
Relationships in the roster Application
A recreational sports system has the following relationships:
- A player can be on many teams.
- A team can have many players.
- A team is in exactly one league.
- A league has many teams.
In roster this is reflected by the following relationships between the Player, Team, and League entities:
- There is a many-to-many relationship between Player and Team.
- There is a many-to-one relationship between Team and League.
The Many-To-Many Relationship in roster
The many-to-many relationship between Player and Team is specified by using the@ManyToMany annotation.
In Team.java, the @ManyToMany annotation decorates the getPlayers method:
@ManyToMany @JoinTable( name="EJB_ROSTER_TEAM_PLAYER", joinColumns= @JoinColumn(name="TEAM_ID", referencedColumnName="ID"), inverseJoinColumns= @JoinColumn(name="PLAYER_ID", referencedColumnName="ID") ) public Collection getPlayers() { return players; }
The @JoinTable annotation is used to specify a table in the database that will associate player IDs with team IDs. The entity that specifies the @JoinTableis the owner of the relationship, so in this case the Team entity is the owner of the relationship with the Player entity. Because roster uses automatic table creation at deploytime, the container will create a join table in the database named EJB_ROSTER_TEAM_PLAYER.
Player is the inverse, or non-owning side of the relationship with Team. As one-to-one and many-to-one relationships, the non-owning side is marked by the mappedBy element in the relationship annotation. Because the relationship between Player and Team is bidirectional, the choice of which entity is the owner of the relationship is arbitrary.
In Player.java, the @ManyToMany annotation decorates the getTeams method:
@ManyToMany(mappedBy="players") public Collection getTeams() { return teams; }
Entity Inheritance in the roster Application
The roster application demonstrates how to use entity inheritance, as described in Entity Inheritance.
The League entity in roster is an abstract entity with two concrete subclasses:SummerLeague and WinterLeague. Because League is an abstract class it cannot be instantiated:
... @Entity @Table(name = "EJB_ROSTER_LEAGUE") public abstract class League implements java.io.Serializable { ... }
Instead, SummerLeague or WinterLeague are used by clients when creating a league. SummerLeagueand WinterLeague inherit the persistent properties defined in League, and only add a constructor that verifies that the sport parameter matches the type of sport allowed in that seasonal league. For example, here is the SummerLeague entity:
... @Entity public class SummerLeague extends League implements java.io.Serializable {
/** Creates a new instance of SummerLeague */
public SummerLeague() {
}
public SummerLeague(String id, String name,
String sport) throws IncorrectSportException {
this.id = id;
this.name = name;
if (sport.equalsIgnoreCase("swimming") ||
sport.equalsIgnoreCase("soccer") ||
sport.equalsIgnoreCase("basketball") ||
sport.equalsIgnoreCase("baseball")) {
this.sport = sport;
} else {
throw new IncorrectSportException(
"Sport is not a summer sport.");
}
}
}
The roster application uses the default mapping strategy of InheritanceType.SINGLE_TABLE, so the@Inheritance annotation is not required. If you wanted to use a different mapping strategy, decorate League with @Inheritance and specify the mapping strategy in thestrategy element:
@Entity @Inheritance(strategy=JOINED) @Table(name="EJB_ROSTER_LEAGUE") public abstract class League implements java.io.Serializable { ... }
roster uses the default discriminator column name, so the @DiscriminatorColumn annotation is not required. Because you are using automatic table generation in roster the Persistence provider will create a discriminator column in the EJB_ROSTER_LEAGUE table called DTYPE, which will store the name of the inherited entity used to create the league. If you want to use a different name for the discriminator column, decorate Leaguewith @DiscriminatorColumn and set the name element:
@Entity @DiscriminatorColumn(name="DISCRIMINATOR") @Table(name="EJB_ROSTER_LEAGUE") public abstract class League implements java.io.Serializable { ... }
Automatic Table Generation in the roster Application
At deploytime the Application Server will automatically drop and create the database tables used by roster. This is done by setting the toplink.ddl-generation property to drop-and-create-tablesin persistence.xml.
jdbc/__default
This feature is specific to the Java Persistence API provider used by the Application Server, and is non-portable across Java EE servers. Automatic table creation is useful for development purposes, however, and the toplink.ddl-generation property may be removed from persistence.xml when preparing the application for production use, or when deploying to other Java EE servers.
Building and Running the roster Application
This section describes how to build, package, deploy, and run the rosterapplication. You can do this using either NetBeans IDE or Ant.
Building, Packaging, Deploying, and Running roster in NetBeans IDE
Follow these instructions to build, package, deploy, and run the roster example to your Application Server instance using NetBeans IDE.
- In NetBeans IDE, select File→Open Project.
- In the Open Project dialog, navigate to tut-install/javaeetutorial5/examples/ejb/.
- Select the roster folder.
- Select the Open as Main Project and Open Required Projects check boxes.
- Click Open Project.
- In the Projects tab, right-click the roster project and select Run.
You will see the following partial output from the application client in the Output tab:
List all players in team T2: P6 Ian Carlyle goalkeeper 555.0 P7 Rebecca Struthers midfielder 777.0 P8 Anne Anderson forward 65.0 P9 Jan Wesley defender 100.0 P10 Terry Smithson midfielder 100.0
List all teams in league L1: T1 Honey Bees Visalia T2 Gophers Manteca T5 Crows Orland
List all defenders: P2 Alice Smith defender 505.0 P5 Barney Bold defender 100.0 P9 Jan Wesley defender 100.0 P22 Janice Walker defender 857.0 P25 Frank Fletcher defender 399.0 ...
Building, Packaging, Deploying, and Running roster Using Ant
To build the application components of roster, enter the following command:
ant
This runs the default task, which compiles the source files and packages the application into an EAR file located at tut-install/examples/ejb/roster/dist/roster.ear.
To deploy the EAR, make sure the Application Server is started, then enter the following command:
ant deploy
The build system will check to see if the Java DB database server is running and start it if it is not running, then deployroster.ear. The Application Server will then drop and create the database tables during deployment, as specified in persistence.xml.
After roster.ear is deployed, a client JAR, rosterClient.jar, is retrieved. This contains the application client.
To run the application client, enter the following command:
ant run
You will see the output, which begins:
[echo] running application client container. [exec] List all players in team T2: [exec] P6 Ian Carlyle goalkeeper 555.0 [exec] P7 Rebecca Struthers midfielder 777.0 [exec] P8 Anne Anderson forward 65.0 [exec] P9 Jan Wesley defender 100.0 [exec] P10 Terry Smithson midfielder 100.0
[exec] List all teams in league L1: [exec] T1 Honey Bees Visalia [exec] T2 Gophers Manteca [exec] T5 Crows Orland
[exec] List all defenders: [exec] P2 Alice Smith defender 505.0 [exec] P5 Barney Bold defender 100.0 [exec] P9 Jan Wesley defender 100.0 [exec] P22 Janice Walker defender 857.0 [exec] P25 Frank Fletcher defender 399.0 ...
The all Task
As a convenience, the all task will build, package, deploy, and run the application. To do this, enter the following command:
ant all
Undeploying order
To undeploy roster.ear, enter the following command:
ant undeploy
Copyright © 2010, Oracle and/or its affiliates. All rights reserved. Legal Notices