310 likes | 406 Views
Enterprise JavaBeans 2.0. Wu Lu. (Cont’d). EJB2.0 Query Language. EJB QL is a declarative language similar in many respects to SQL Is intended to be portable to all EJB2.0-compliant containers and persistence managers. The Usage of Find Method in EJB1.1.
E N D
Enterprise JavaBeans 2.0 • Wu Lu (Cont’d)
EJB2.0 Query Language • EJB QL is a declarative language similar in many respects to SQL • Is intended to be portable to all EJB2.0-compliant containers and persistence managers.
The Usage of Find Method in EJB1.1 • Declare find method in home interface • Modify the xml file: • C:\orion\application-deployments\factory\ejbs\orion-ejb-jar.xml • <finder-method query=“”> • <finder-method query=“$status LIKE ‘o%’”> • Advange of Query Language (QL) : • Developed and tested once, Use anywhere
Methods which use QL • Finder Methods • Select Methods • They are not exposed to clients. They are used in the implementation class alone. • They allow the programmer to retrieve dependent objects, values, or related EJBs based on relevant search criteria.
Advantages of using a select method • A select method written in QL can be more efficient than java programming. • Declarative SQL language is more maintainable and less error prone
Types of Select Method • ejbSelect<METHOD> • ---Operate on all instances of that entity • ---Can return individual instances or collections of any type represented by a cmp-field , as well as remote interfaces represented by a cmr-field. • ejbSelect<METHOD>InEntity • ---Associated with a particular entity identity. • ---Can not be used from the implementations of a home-interface business method. • ---Introduced as a way of efficiently navigating the EJBs relationships with other entity beans and with its dependent objects • **METHOD represents a descriptive name for the activity of the method.
Where to specify a Query • A query is specified in two parts: • Method declaration • Specify the QL in XML deployment descriptor
Method declaration(1) • Find Method: • Declared in the home interface, just as it is for EJB1.1 cmp • Returning the remote interface type • Must have a name of the form findByXXX • Throw RemoteException and FinderException
Method declaration(2) Select Method: 1.Declared as abstract in the bean’s main implementation class. 2. Must have a name of the form ejbSelect<METHOD>() or ejbSelect<METHOD>InEntity() 3. Throw javax.ejb.FinderException 4. Return type can be individual instances or collections of any type of cmp-field and cmr-field 5. The collection class must be either java.util.Collection or java.util.Set Public abstract class SportTeamEJB implements EntityBean { abstract public String ejbSelectShipToCityInEntity() throws FinderExecption; }
Specify query language • Specify in the XML deployment descriptor • A query is defined as a <query> element as a child of the • relevant <entity> element. • A query has 3 parts: • ---an optional description • ---a method it applied • ---the query language string <query> <query-method> <method-name>ejbSelectOverdueLibraryBooksInEntity<method-name> <method-params/> <query-method> <ejb-ql> SELECT b FROM b in books WHERE overdue is TRUE</ejb-ql> <query>
How to specify a query • An EJB QL string may have up to 3 clauses: 1. Select :indicate the return type of the query or of the instances in a returned collection. 2. From:declare variables that represent navigation paths in your schema ( correlation variables). These variables are used in SELECT or WHERE clauses. 3. Where:a conditional expression that limits the results of your query. It can include parameters from the finder or select method.
The concept of schema • Is the definition of its cmp-fields and cmr-fields • A schema type has a name. • Entity bean: the name is specified in the deployment descriptor with the element <abstract-schema-name> • Dependent object: same as the dependent object name
The concept of schema • Every query in an entity bean must use that bean’s schema, or the schema of a related objects in the same ejb-jar, for navigation. • A bean’s schema is different from its remote interface. • Can not refer to a schema of an entity or dependent object that is defined outside your ejb-jar. You may call finder methods on entities outside your JAR, but you may not navigate to their dependent objects or refer to their state.
Navigation Operator “.” • Use navigation operator “.” to traverse cmp-and cmr-fields. • SELECT shipping_address.city • String ejbSelectShipToCityInEntity() throws FinderException • Java.util.Collection ejbSelectShipToCity() throws FinderException • Java.util.Set ejbSelectShipToCity() throws FinderException • SELECT shipping_address WHERE shipping_address.state=‘NY’ • WHERE billing_address.state=‘MA’
Navigating Over Collections • Can not use navigation operator to navigate into a many-valued relationship. • SELECT lineitems.product.name WHERE lineitems.shipped=TRUE • Declare a correlation variable in the From clause • SELECT 1.product.name FROM 1 in lineitems WHERE 1.shipped=TRUE
Input Parameters • To parameterize a query: • 1. Add the appropriate parameters to the method declaration. • 2. Refer to those parameters in the WHERE clause with a question mark , followed by a index of the parameter in the method declaration. • 3. Date literals need to be expressed as a standard Java long milliseconds value. • OrderEJB findByCustomerName(String custname) throws FinderException • WHERE custname=?1
Other Entity Beans • Query references to entity beans that are within the same ejb-jar and use the EJB2.0 persistence model represent a schema. • SELECT 1.product.name FROM 1in lineitems WHERE 1.shipped= TRUE • Query references to entity beans that are outside the eib-jar or use the EJB1.1 persistence model represent the remote interface of the entity bean. • SELECT 1.product FROM 1in lineitems WHERE 1.shipped= TRUE • The remote interface navigation operation => • SELECT 1=>product FROM 1 in lineitems WHERE 1.shipped=true
Where Clause Options • Logical operator: NOT, AND,OR • Comparison operator:=,>,>=,<,<=,<> • Types: number, string, boolean, object • Comparison for entity bean remote references or schemas are done by compare their primary key values. • Comparison for dependent objects are also probably done by compare their primary key values. • Arithmetic operators: +, -, *, / • BETWEEN expression: [NOT] BETWEEN x AND y
IN expression: • [NOT] IN (string, …) • Entity-reference [NOT] IN (finder-expression) • LIKE expression: • [NOT] LIKE pattern [ESCAPE character] • _: representing any single character • %:representing any sequence of zero or more characters • NULL test: • IS [NOT] NULL
Queries from the Manufacturing Application • (1) Location: application-server specific file • (2) Format: application-server specific format • <finder-method query=“$status LIKE ‘o%’”> <method> • <ejb-name>Orders</ejb-name> • <method-name>findOpenOrders</method-name> • <method-params></method-params> • </method> • </finder-method> • <finder-method query=“$status NOT LIKE‘c%’ AND $status NOT LIKE ‘f%’”> • <method> • <ejb-name>Orders</ejb-name> • <method-name>findUncompletedOrders</method-name> • <method-params></method-params> • </method> • </finder-method>
(1)Location: deployment descriptor • (2)Format: in a standard format(EJB QL) • <query> • <query-method> • <method-name> findOpenOrders</method-name> • <method-params/> • <query-method> • <ejb-ql> WHERE status LIKE ‘o%’</ejb-ql> • <query> • <query> • <query-method> • <method-name> findUncompletedOrders</method-name> • <method-params/> • <query-method> • <ejb-ql> WHERE status NOT LIKE ‘c%’ AND status NOT LIKE ‘f%’</ejb-ql> • <query>
Message-Driven Beans • Advantages that messaging can provide: • 1. Messaging can provide reliable, asynchronous delivery of information from the client to server. • 2. Messaging can be a simple way to provide interoperability with other enterprise components. • 3. Messaging can be used to implement a public-subscribe architecture. A message-driven bean can be a component that listens for messages on a particular topic.
MDB Vs Other types of EJB • Similar to a stateless session bean in terms of the role it will play in architecture. • It is an entry point into your business logic from a client. • Can call methods on stateless session EJBs and on entity EJBs. • Updates to resources such as a database can be made in the same transaction as message acknowledgement. • If the transaction is rolled-back, the message would not be acknowledged and it will be redelivered.
MDB Vs Other types of EJB • Difference: • It has neither a home nor a remote interface. • Instead, its public interface consists of a single onMessage() method called by the EJB container when messages arrive. The onMessage() method has a single argument: the message that is being delivered. • Exception handling is different. • The onMessage() method does not throw any checked and unchecked exception. If a run time exception is thrown away, the event is logged, the instance of the bean is discarded, and any existing transaction is rolled back.
Message-driven beans do not have a client security context because that information is not propagated with a message. • Message-driven beans can execute in the context of a transaction. • The transaction can be bean- or container-managed. • As there is no way to propagate an existing transactional context, a contained-managed transaction must be newly created. • EJB container handles message acknowledgement. • The bean developer should not use the JMS API for message acknowledgement.
Lifecycle Methods • A message-driven bean must implement the javax.ejb.MessageDrivenBean interface • setMessageDrivenContext(MessageDrivenContext mdc) • It’s similar to the EntityContext or SessionContext. • ejbCreate() • ejbRemove() • A message-driven bean instance is single-threaded. A container may instantiate multiple instances of message-driven beans to process message concurrently
MDB and JMS • A message-driven bean is associated with a single JMS topic or queue. The deployer associates the bean with a particular topic or queue when the bean is deployed in the enterprise’s environment. • It’s better to associate ONE message-driven bean with ONE JMS topic or queue. • See chap28 for more details
Package mypackage • Import javax.ejb.*; • Import javax.jms.*; • Public void onMessage(Message msg) { • //your business logic • } • Public void setMessageDrivenContext(MessageDrivenContext mdc) { • this.mdc=mdc; • } • Public void ejbCreate() { • // often empty • } • Public void ejbRemove(){ • // often empty • }
EJB 2.0 compliant persistence manager platform--ePersistJ™ 2.0 • Release at 03/12/2001 • EJB-QL support for portable select and selectInEntity methods • Complete support for one-to-one, one-to-many and many-to-many relations among entity.