Date post: | 13-Dec-2015 |
Category: |
Documents |
Upload: | rolf-clark |
View: | 220 times |
Download: | 0 times |
v041109 Container Managed Relationships 1
EnterpriseJava
Container Managed Relationships(CMR)
Source:
“Enterprise JavaBeans, 3rd Edition”, Richard Monson-Haefel
v041109 Container Managed Relationships 2
EnterpriseJava
CMR
• Enabled with EJB 2.0– EJB 1.1 had support for persistent fields but not
relationships
• Extends the abstract schema of the Entity Bean– Abstract accessors must be defined for CMR fields– CMR uses only Local Interfaces
• Only EJBs deployed together in the same deployment descriptor may have relationships with one another– use same database and JVM
v041109 Container Managed Relationships 3
EnterpriseJava
Seven Relationship Types
• One-to-One (unidirectional, bidirectional)• One-to-Many (unidirectional, bidirectional)• Many-to-One (unidirectional)
– Many-to-One and One to Many bidirectional identical
• Many-to-Many (unidirectional, bidirectional)
v041109 Container Managed Relationships 4
EnterpriseJava
Defined and Initialized in the EJBClass
public abstract class BorrowerEJB implements EntityBean {
public abstract void setId(String id);
public abstract String getId();
public abstract void setIdentity(PersonLocal person);
public abstract PersonLocal getIdentity();
//create transaction does not complete until both the ejbCreate and ejbPostCreate are called
public String ejbCreate(PersonLocal identity) throws BorrowerException {
setId(identity.getId()); //primary key values must be set in ejbCreate
return null;
}
public void ejbPostCreate(PersonLocal identity) {
setIdentity(identity); //relationships must be set in ejbPostCreate
}
}
id will be defined as a CMP Field
identity will be defined as a CMR Field
v041109 Container Managed Relationships 5
EnterpriseJava
Used in the EJB Class
public String getName() {
return getIdentity().getFirstName() + " " + getIdentity().getLastName();
}
public String getPhoneNumber() {
return getIdentity().getPhoneNumber();
}
public String getAddress() {
return getIdentity().getAddress();
}
v041109 Container Managed Relationships 6
EnterpriseJava
Defined in ejb-jar.xml
<ejb-jar>
<enterprise-beans>
<entity>
...
</entity>
...
</enterprise-beans>
<relationships>
<ejb-relation> <!-- Borrower(0..1)->(1)Person (unidirectional) -->
<ejb-relation-name>Borrower-Person</ejb-relation-name>
...
</ejb-relation>
...
</relationships>
</ejb-jar>
v041109 Container Managed Relationships 7
EnterpriseJavaDefining Borrower->Person
in ejb-jar.xml<ejb-relation> <!-- Borrower(0..1)->(1)Person (unidirectional) -->
<ejb-relation-name>Borrower-Person</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>Borrower-to-Identity</ejb-relationship-role-name>
<multiplicity>One</multiplicity>
<relationship-role-source>
<ejb-name>Borrower</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>identity</cmr-field-name>
</cmr-field>
</ejb-relationship-role>
Matches void setIdentity(PersonLocal)PersonLocal getIdentity()from EJB Class
v041109 Container Managed Relationships 8
EnterpriseJavaDefining Person->Borrower
in ejb-jar.xml <ejb-relationship-role>
<ejb-relationship-role-name>Identity-to-Borrower</ejb-relationship-role-name>
<multiplicity>One</multiplicity>
<relationship-role-source>
<ejb-name>Person</ejb-name>
</relationship-role-source>
</ejb-relationship-role>
</ejb-relation> Unidirectional choice signified by nocmr-field in Person mapping back to Borrower
v041109 Container Managed Relationships 9
EnterpriseJava
ejb-jar.xml
• Every Relationship must have a name• Every <ejb-relation> has exactly two <ejb-
relationship-role> sub-elements defined– ejb-relationship-role must define a cmr-field to be
navigatable to the related object (otherwise unidirectional)
v041109 Container Managed Relationships 10
EnterpriseJava
Stored in the Database
create table Person (
id varchar(12) not null unique,
firstName varchar(32) not null,
lastName varchar(32) not null,
address varchar(128),
phoneNumber char(10)
);
create table Borrower (
id varchar(12) not null,
beginDate date not null,
endDate date,
person_id char(12)
);
v041109 Container Managed Relationships 11
EnterpriseJavaMapped to the Database
by the Implementation• weblogic-cmp-rdbms-jar.xml<weblogic-rdbms-jar>
<weblogic-rdbms-bean>
...
</weblogic-rdbms-bean>
<weblogic-rdbms-relation>
…
</weblogic-rdbms-relation>
...
<create-default-dbms-tables>False</create-default-dbms-tables>
</weblogic-rdbms-jar>
v041109 Container Managed Relationships 12
EnterpriseJavaMapped to the Database
by the Implementation<weblogic-rdbms-relation>
<relation-name>Borrower-Person</relation-name>
<weblogic-relationship-role>
<relationship-role-name>Borrower-to-Identity
</relationship-role-name>
<column-map>
<foreign-key-column>person_id</foreign-key-column>
<key-column>id</key-column>
</column-map>
</weblogic-relationship-role>
<weblogic-relationship-role>
<relationship-role-name>Identity-to-Borrower
</relationship-role-name>
</weblogic-relationship-role>
</weblogic-rdbms-relation>
names must matchvalues specified inejb-jar.xml
id is column in Person
person_id is column in Borrower
v041109 Container Managed Relationships 13
EnterpriseJavaMapped to the Database
by the Implementation• jbosscmp-jdbc.xml
</jbosscmp-jdbc>
…
</enterprise-beans>
…
</enterprise-beans>
<relationships>
<ejb-relation>
…
</ejb-relation>
</relationships>
</jbosscmp-jdbc>
v041109 Container Managed Relationships 14
EnterpriseJavaMapped to the Database
by the Implementation<ejb-relation> <ejb-relation-name>Borrower-Person</ejb-relation-name> <foreign-key-mapping/>
<ejb-relationship-role> <ejb-relationship-role-name>Borrower-to-Identity </ejb-relationship-role-name> </ejb-relationship-role>
<ejb-relationship-role> <ejb-relationship-role-name>Identity-to-Borrower </ejb-relationship-role-name> <key-fields> <key-field> <field-name>id</field-name> <column-name>person_id</column-name> </key-field> </key-fields> </ejb-relationship-role></ejb-relation>
names must matchvalues specified inejb-jar.xml
id is column in Person
person_id is column in Borrower
v041109 Container Managed Relationships 15
EnterpriseJava
One-to-One Unidirectionalinterface BorrowerLocal String getId(); String getName(); String getPhoneNumber(); String getAddress(); Date getBeginDate(); Date getEndDate(); boolean isValid(); void terminate();
interface PersonLocal String getId(); String getFirstName(); void setFirstName(String fname); String getLastName(); void setLastName(String lname); String getAddress(); void setAddress(String address); String getPhoneNumber(); void setPhoneNumber(String number);
1
0..1
table Person id varchar(12) not null unique, firstName varchar(32) not null, lastName varchar(32) not null, address varchar(128), phoneNumber char(10)
table Borrower id varchar(12) not null, beginDate date not null, endDate date, person_id varchar(12)
1
0..1
v041109 Container Managed Relationships 16
EnterpriseJava
One-to-One Unidirectional
• BorrowerEJB public abstract void setIdentity(PersonLocal person); public abstract PersonLocal getIdentity();• ejb-jar.xml <cmr-field> <cmr-field-name>identity</cmr-field-name> </cmr-field>• weblogic-cmp-rdbms-jar.xml <column-map> <foreign-key-column>person_id</foreign-key-column> <key-column>id</key-column> </column-map>• jbosscmp-jdbc.xml
<key-field> <field-name>id</field-name> <column-name>person_id</column-name></key-field>
v041109 Container Managed Relationships 17
EnterpriseJavaNot Possible to Share Object
from 1:1 Relation
a:Borrower x:Person
b:Borrower y:Person
PersonLocal x = a.getIdentity();b.setIdentity(x);
a:Borrower x:Person
b:Borrower y:Person
v041109 Container Managed Relationships 18
EnterpriseJava
One-to-One Bidirectionalinterface BorrowerLocal String getId(); String getName(); String getPhoneNumber(); String getAddress(); Date getBeginDate(); Date getEndDate(); boolean isValid(); void terminate();
interface PersonLocal String getId(); String getFirstName(); void setFirstName(String fname); String getLastName(); void setLastName(String lname); String getAddress(); void setAddress(String address); String getPhoneNumber(); void setPhoneNumber(String number); Borrower getBorrower()
1
0..1
table Person id varchar(12) not null unique, firstName varchar(32) not null, lastName varchar(32) not null, address varchar(128), phoneNumber char(10)
table Borrower id varchar(12) not null, beginDate date not null, endDate date, person_id varchar(12)
1
0..1
v041109 Container Managed Relationships 19
EnterpriseJava
One-to-One Bidirectional
• BorrowerEJB public abstract void setIdentity(PersonLocal person); public abstract PersonLocal getIdentity();
• PersonEJB public abstract void setBorrower(BorrowerLocal person); public abstract BorrowerLocal getBorrower ();
• ejb-jar.xml <cmr-field> //from borrower to person <cmr-field-name>identity</cmr-field-name> </cmr-field> <cmr-field> //from person to borrower <cmr-field-name>borrower</cmr-field-name> </cmr-field>
Note!!! - bidirectional and unidirectional database schema is identical. Only EJB class and portions of the deployment descriptor changed
v041109 Container Managed Relationships 20
EnterpriseJava
One-to-One Bidirectional (cont.)
• weblogic-cmp-rdbms-jar.xml <column-map> //from borrower to person
<foreign-key-column>person_id</foreign-key-column>
<key-column>id</key-column>
</column-map>
• jbosscmp-jdbc.xml<key-field>
<field-name>id</field-name>
<column-name>person_id</column-name>
</key-field>
v041109 Container Managed Relationships 21
EnterpriseJavaNot Possible to Share Object
from 1:1 Relation
a:Borrower x::Person
b:Borrower y::Person
PersonLocal x = a.getIdentity();b.setIdentity(x);
a:Borrower x::Person
b:Borrower y::Person
v041109 Container Managed Relationships 22
EnterpriseJava
One-to-Many Bidirectionalinterface BorrowerLocal Set getCheckouts(); Date getBeginDate(); Date getEndDate(); boolean isValid(); void terminate();
interface CheckoutLocal Integer getId(); Date getOutDate(); boolean isOverdue(); BorrowerLocal getBorrower();
*
1
table Checkout id int not null unique, outDate longint not null, borrower_id varchar(12)
table Borrower id varchar(12) not null, beginDate date not null, endDate date, person_id varchar(12)
*
1
v041109 Container Managed Relationships 23
EnterpriseJava
One-to-Many Bidirectional
• BorrowerEJB public abstract void setCheckouts(Set checkouts);
public abstract Set getCheckouts();
public void addCheckout(CheckoutLocal checkout) throws CheckoutException
{ getCheckouts().add(checkout); }
– java.util.Collection and Set are only allowable CMR-many data types
• Collection allowed to have duplicates
• Set not allowed to have duplicates
• CheckoutEJB public abstract void setBorrower(BorrowerLocal borrower);
public abstract BorrowerLocal getBorrower();
v041109 Container Managed Relationships 24
EnterpriseJava
One-to-Many Bidirectional (cont.)
• ejb-jar.xml <multiplicity>One</multiplicity>
<cmr-field>
<cmr-field-name>checkouts</cmr-field-name>
<cmr-field-type>java.util.Set</cmr-field-type>
</cmr-field>
<multiplicity>Many</multiplicity>
<cmr-field>
<cmr-field-name>borrower</cmr-field-name>
</cmr-field>
v041109 Container Managed Relationships 25
EnterpriseJava
One-to-Many Bidirectional (cont.)
• weblogic-cmp-rdbms-jar.xml <column-map>
<foreign-key-column>borrower_id</foreign-key-column>
<key-column>id</key-column>
</column-map>
• jbosscmp-jdbc.xml<key-field>
<field-name>id</field-name>
<column-name>borrower_id</column-name>
</key-field>
v041109 Container Managed Relationships 26
EnterpriseJavaNot Possible to Share Object
from 1:N Relation
a:Borrower x:Checkout
b:Borrower z:Checkout
Collection checkouts = a.getCheckouts();b.setCheckouts(checkouts);
y:Checkout
a:Borrower x:Checkout
b:Borrower z:Checkout
y:Checkout
v041109 Container Managed Relationships 27
EnterpriseJavaNot Possible to Share Object
from 1:N Relation
a:Borrower x:Checkout
b:Borrower z:Checkout
BorrowerLocal b = z.getBorrower();y.setBorrower(b);
y:Checkout
a:Borrower x:Checkout
b:Borrower z:Checkout
y:Checkout
v041109 Container Managed Relationships 28
EnterpriseJava
Iterating the Many Collection
for(java.util.Iterator i=getCheckouts().iterator(); i.hasNext(); ) {CheckoutLocal co = (CheckoutLocal)i.next();//use co
}• Must not add/remove elements from collection
while using iterator– only exception is use of “i.remove()”
• Empty collections are returned for no elements
v041109 Container Managed Relationships 29
EnterpriseJava
Many-to-Many Unidirectionalinterface TopicLocal String getId(); String getTitle(); Set getAuthors(); void addAuthor(PersonLocal authors);
interface PersonLocal String getId(); String getFirstName();*
*
table Person id varchar(12) not null, firstName varchar(32)
table Topic id varchar(12) not null, title varchar(32) not null,
table PersonTopicLink topic_id varchar(12) not null, person_id varchar(12) not null
1
1
*
*
Use Linking Table for N:Nor linking legacy tables together
v041109 Container Managed Relationships 30
EnterpriseJava
Many-to-Many Unidirectional
• TopicEJB public abstract void setAuthors(Set authors);
public abstract Set getAuthors();
public void addAuthor(PersonLocal author)
{ getAuthors().add(author); }
• ejb-jar.xml <multiplicity>Many</multiplicity>
<cmr-field>
<cmr-field-name>authors</cmr-field-name>
<cmr-field-type>java.util.Set</cmr-field-type>
</cmr-field>
<multiplicity>Many</multiplicity>
v041109 Container Managed Relationships 31
EnterpriseJavaMany-to-Many Unidirectional (cont.)
weblogic-cmp-rdbms-jar.xml<weblogic-rdbms-relation>
<relation-name>Topic-Author</relation-name>
<table-name>cmrLibrary_PersonTopicLink</table-name>
<weblogic-relationship-role>
<relationship-role-name>Topic-to-Author</relationship-role-name>
<relationship-role-map>
<column-map>
<foreign-key-column>person_id</foreign-key-column>
<key-column>id</key-column>
</column-map>
</relationship-role-map>
</weblogic-relationship-role>
v041109 Container Managed Relationships 32
EnterpriseJavaMany-to-Many Unidirectional (cont.)
weblogic-cmp-rdbms-jar.xml<weblogic-relationship-role>
<relationship-role-name>Author-to-Topic</relationship-role-name>
<relationship-role-map>
<column-map>
<foreign-key-column>topic_id</foreign-key-column>
<key-column>id</key-column>
</column-map>
</relationship-role-map>
</weblogic-relationship-role>
</weblogic-rdbms-relation>
v041109 Container Managed Relationships 33
EnterpriseJavaMany-to-Many Unidirectional (cont.)
jbosscmp.xml<ejb-relation> <ejb-relation-name>Topic-Author</ejb-relation-name> <relation-table-mapping> <table-name>cmrLibrary_PersonTopicLink</table-name> </relation-table-mapping>
<ejb-relationship-role> <ejb-relationship-role-name> Topic-to-Author </ejb-relationship-role-name> <key-fields> <key-field> <field-name>id</field-name> <column-name>person_id</column-name> </key-field> </key-fields> </ejb-relationship-role>
v041109 Container Managed Relationships 34
EnterpriseJavaMany-to-Many Unidirectional (cont.)
jbosscmp.xml<ejb-relationship-role> <ejb-relationship-role-name> Author-to-Topic </ejb-relationship-role-name> <key-fields> <key-field> <field-name>id</field-name> <column-name>topic_id</column-name> </key-field> </key-fields> </ejb-relationship-role>
</ejb-relation>
v041109 Container Managed Relationships 35
EnterpriseJavaObjects Sharable in
N:N Relation
a:Topic x:Person
b:Topic z:Person
Collection authors = a.getAuthors();b.setAuthors(authors);
y:Person
a:Topic x:Person
b:Topic z:Person
y:Person
v041109 Container Managed Relationships 36
EnterpriseJavaObjects Sharable in
N:N Relation
a:Topic x:Person
b:Topic z:Person
PersonLocal x = a.getAuthorByName(“x”);b.addAuthor(x);
y:Person
a:Topic x:Person
b:Topic z:Person
y:Person
v041109 Container Managed Relationships 37
EnterpriseJava
Cascade Delete
• Causes the delete of one or more objects when a related object is deleted
• Used with one-to-one and one-to-many relationships– entity bean that causes the cascade delete must have a
multiplicity of one
• Implementation be deferred to database by container
v041109 Container Managed Relationships 38
EnterpriseJavaDefining Cascade Delete
in ejb-jar.xml <relationships>
<ejb-relation> <!-- Borrower(0..1)->(1)Person (unidirectional) -->
<ejb-relation-name>Borrower-Person</ejb-relation-name>
<ejb-relationship-role>
<ejb-relationship-role-name>Borrower-to-Identity
</ejb-relationship-role-name>
<multiplicity>One</multiplicity>
<cascade-delete/> <!-- delete Borrower role when delete Person -->
<relationship-role-source>
<ejb-name>Borrower</ejb-name>
</relationship-role-source>
<cmr-field>
<cmr-field-name>identity</cmr-field-name>
</cmr-field>
</ejb-relationship-role>