enterprise java v041109container managed relationships1 container managed relationships (cmr)...

38
v041109 Container Managed Relat ionships 1 Enterprise Java Container Managed Relationships (CMR) Source: “Enterprise JavaBeans, 3rd Edition”, Richard Monson-Haefel

Upload: rolf-clark

Post on 13-Dec-2015

221 views

Category:

Documents


0 download

TRANSCRIPT

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>