Top Banner
 EJB 3.0 Rajesh Patel [email protected] Software Developer Partner Harpoon Technologies St. Louis Gateway JUG June 5th, 2007
34

7EC26BF1d01

Apr 10, 2018

Download

Documents

Senthil Raja
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 1/34

EJB 3.0

Rajesh Patel

[email protected] Developer Partner Harpoon Technologies

St. Louis Gateway JUGJune 5th, 2007

Page 2: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 2/34

My Background

● Java Developer for 5 years● 10 years in software industry.● Mentoring Java Developers● JBoss Consulting

Page 3: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 3/34

EJB 2.1

● EJB 2.1 too complicated● Too Many interfaces to implement● Too many difficult and non standard XML

Descriptors

Page 4: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 4/34

Page 5: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 5/34

EJB3-JSR 220

● Documentation available athttp://java.sun.com/products/ejb/docs.html

● EJB 3.0 Simplified(50 pages)● EJB 3.0 Persistence API(191 pages)● EJB 2.1 Core(646 pages)● EJB 3.0 spec is 1/3 size of EJB 2.1

– That is if you leave out EJB 2.1

Page 6: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 6/34

EJB Types

● Stateless Session Bean – Don't maintain state between calls

● Statefull Session Bean – Store state between calls – like a shopping cart

● Entity Bean – Used for beans that need to be persisted

● Message Driven Bean – A bean that responds to messages(ie JMS/SMTP)

Page 7: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 7/34

Remote vs. Local

● Local interface is a direct java invocation● Remote is a call to another VM via RMI● Original EJB designs had everything remote● Led to the EJB being perceived as slow● Colocate as much as possible

Web app and EJB should be in same cont.

Page 8: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 8/34

Session Beans

● Don't have to Implement any large interface

● Does not throw RemoteException

– In fact no EJB throws RemoteException

– Also, all EJB 3's throw only runtime exceptions

Page 9: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 9/34

Stateless Session Bean Example

@Local public interface CalculatorLocal {public int add(int x, int y);public int subtract(int x, int y);

}

@Remote public interface CalculatorRemote {public int add(int x, int y); // Look Ma no Remote Exceptionpublic int subtract(int x, int y);

}@Stateless public class CalculatorBean implements CalculatorRemote,CalculatorLocal{

public int add(int x, int y) {return x + y;}public int subtract(int x, int y) {

Return x – y;}

}

Page 10: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 10/34

Stateful Session Bean● Created on Lookup● @Remove – Bean is removed after method call

@Local public interface Incrementer {public int next();public void remove();

}@Stateful public class IncrementerBean implements Incrementer {

int count=0;public int next() {count++;return count;

}@Remove public void remove(){}

}

Page 11: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 11/34

Transactions

● @TransactionAttribute defines the transactionboundary for a session bean method.

@Stateful public class ShoppingCartBean implementsShoppingCart {

@Remove@TransactionAttribute(REQUIRED)public void checkout() {

…}

}

Page 12: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 12/34

Transaction Attributes● REQUIRED – Start new transaction if no current tx

– Assumed if using CMT and no attribute specified – “Intelligent default”

REQUIRESNEW – Always start new TX, suspend old● SUPPORTS – Don't start new tx, but use existing● MANDATORY – Require the caller to have started TX● NEVER – Forbid the caller to have started TX● NOTSUPPORTED – Suspend existing TX.

Page 13: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 13/34

Security

● Annotations Defined by JSR-250 – JSR-250 defines common annotations for java 5

@Stateful public class ShoppingCartBean implementsShoppingCart {

@MethodPermission({“valid_customer”})public void checkout() {

…}

}

Page 14: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 14/34

Dependency Injection

● @EJB for ejbs● @ Resource for resources

@Statefulpublic class FibonacciBean implements Fibonacci {

int x=0,y=1;@EJB private Calculator calculator;public int next() { // Mathematicians: This alg not right...

int next = calculator.add(x,y);x=y;y=next;return next;

}

Page 15: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 15/34

Interceptors● Allow custom code to be applied to an EJB● Simply add @AroundInvoke to a method● Introduces AOP to EJB

@Statelesspublic class CalculatorBean implements Calculator {

public int add(int x, int y) {return x + y;

}@AroundInvoke

public Object calcInterceptor(InvocationContext ctx) throws Exception{

System.out.println("*** Intercepting call to EmailMDB.mdbInterceptor()");return ctx.proceed();

}}

Page 16: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 16/34

Interceptors

● A custom interceptor class can be defined

@Stateless@Interceptors ({"com.my.TracingInterceptor"})public class EmailSystemBean

{...

}

Page 17: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 17/34

Interceptor Classpublic class TracingInterceptor {

@AroundInvokepublic Object log(InvocationContext ctx) throws Exception{

System.out.println("*** TracingInterceptor intercepting");long start = System.currentTimeMillis();try{

return ctx.proceed();}

catch(Exception e){

throw e;}finally{

long time = System.currentTimeMillis() - start;String method = ctx.getBean().getClass().getName() +"." + ctx.getMethod().getName() + "()";

System.out.println("*** TracingInterceptor invocation of "+ method + " took " + time + "ms");}

}}

Page 18: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 18/34

Entity Beans

● No interfaces to implement everything is POJO – Notice the trend :)

● All types of relationships supported: one-to-many, many-to-one, one-to-one, many-to-many

● Inheritance● Polymorphic Queries● Based on Hibernate

Page 19: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 19/34

Entity Beans

● Only 2 annotations needed to get started● @Entity and @Id

Page 20: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 20/34

Entity Bean Example

@Entitypublic class Product { // table name defaults to product

private int id;String product;@Id(strategy=GenerationType.AUTO)

public int getId() {return id;} // column defaults to idpublic void setId(int id) {this.id = id;}

public String getProduct() { // columnt default to productreturn product;

}public void setProduct(String product) {

this.product = product;}

}

Page 21: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 21/34

Entity Bean Example

@Entity@Table(name=“vendor_product”)public class Product {

private int id;String product;@Id(strategy=GenerationType.AUTO)@Column(name=“product_id”)public int getId() {return id;}public void setId(int id) {this.id = id;}

// column defaults to productpublic String getProduct() {

return product;}public void setProduct(String product) {

this.product = product;}

Page 22: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 22/34

Entity Lifecyle

● Transient – Newly created and not saved● Persistent – Managed by Entity Manager

(loaded/saved)● Detached

● Serialized out of Virtual Machine● Persistence Context Ends

Page 23: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 23/34

Entity Lifecycle EntityManager em = (EntityManager)getInitialContext().lookup("java:/EntityManagers/custdb");

// Bean Managed TransactionTransactionManager tm = (TransactionManager)

getInitialContext().lookup("java:/TransactionManager");

tm.begin();Product product = new Product(); // product is transientem.persist(product); // product is persistedtm.commit(); // product is detached

tm.begin();

em.merge(product); // Detached product becomespersisted

em.remove(product); // Persisted product becomes transienttm.commit();

Page 24: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 24/34

Persistence Context

● Container Managed Transaction Scoped● Container Managed Extended● Application Managed Transaction Scoped● Application Managed Extended

@PersistenceContext(type=EXTENDED)EntityManager em;

Page 25: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 25/34

Extended vs Transaction Scoped

● Transaction scoped – Any modified enitities will be committed at

transaction commit●

Extended – Can only be used with stateful session beans – Used to keep entities associated with an entity

manager between requests – Easier than storing objects on the HTTP session

and having to deal with detached entities – No more lazy load exceptions

Page 26: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 26/34

Relationships

● @ManyToOne● @OneToMany● @OneToOne● @ManyToMany

Page 27: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 27/34

Many To One

@Entity

public class Customer implements Serializable

{

...

private Collection<Order> orders = new HashSet();

...

@OneToMany(cascade = CascadeType.PERSIST)public Collection<Order> getOrders() {

return orders;

}

public void setOrders(Collection<Order> orders) {

this.orders = orders;

}

Page 28: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 28/34

Cascading

● Persist - CascadeType.PERSIST● Remove - CascadeType.DELETE● Merge - CascadeType.MERGE

Page 29: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 29/34

Customer Customer cust = new Customer();

cust.setName("Bill2");

Order order = new Order();order.setName("Cold Coffee");

Order order2 = new Order();order2.setName("Hot Coffee");

cust.getOrders().add(order);cust.getOrders().add(order2);

em.persist(cust); // Orders are automatically saved via a cascade

Page 30: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 30/34

EJBQL

● Very similar to HQL● HQL very similar to SQL

// a single object – notice the implice join to the

// shipping address table

SELECT oFROM Order oWHERE o.shippingAddress.state = ‘CA’

// The collection order is agressively fetch// using a Fetch Join – used for performance// optimizations.SELECT DISTINCT cFROM Customer c JOIN FETCH c.ordersWHERE c.address.state = ’CA’

Page 31: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 31/34

Embedded JBoss

public static void main(String str[]){

Bootstrap.getInstance().bootstrap();

Bootstrap.getInstance().scanClasspath("anejbjar.jar");

InitialContext ctx = new InitialContext();Calculator calculator = (Calculator) ctx.lookup(Calculator.class.getName());

calculator.add(2,2);

}

● Lightweight JBoss● Allows easy unit test of EJBs, JMX beans.● Embedded JBoss Wiki

Page 32: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 32/34

Vendors

● JBoss – EJB3 installable option in 4.0.x – Comes by default with 4.2

● BEA – Weblogic 10● Resin● Oracle AS – Latest Release

Page 33: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 33/34

JBoss Consulting Services

● Harpoon Technologies is a JBoss partner ● Several Certified consultants● We can help with performance tuning,

training/mentoring, application development

Page 34: 7EC26BF1d01

8/8/2019 7EC26BF1d01

http://slidepdf.com/reader/full/7ec26bf1d01 34/34

Questions?