Download presentation
Presentation is loading. Please wait.
Published byWarren Bryan Modified over 9 years ago
1
Professional Open Source © JBoss Group, 2003. 1 15 October 2015 EJB 3.0 Ease of use
2
© JBoss Group, 2003. 2 Professional Open Source JBoss Inc. Open Source Projects –JBoss Application Server (#1 Market Share) –Hibernate –JGroups –JBoss jBPM –JBoss AOP –JBoss Portal –JBoss Mail –JBoss Eclipse IDE –Javassist –Tomcat JCP Committees –Executive –EJB 3.0 –Web Services –J2EE 1.5 –JBI
3
© JBoss Group, 2003. 3 Professional Open Source JBoss Inc. Services –Training Coming to a city near you Onsite on demand –24x7 Support –Consulting –ISV/OEM Support Partnerships 10% Discount for JUG members on all training EJB 3.0 training coming soon
4
© JBoss Group, 2003. 4 Professional Open Source Overall Agenda Goals of EJB 3.0 JDK 5.0 Annotations Session Beans Entity Beans Interceptors Callback Listeners
5
© JBoss Group, 2003. 5 Professional Open Source Goals of EJB 3.0 EJB 2.1 is too “noisy” –Too many interfaces to implement –“XML Hell” too many complex deployment descriptors –API is too verbose –API too complicated in general Simplify the EJB programming model Focus on ease of use Facilitate Test Driven Development Make it simpler for average developer Increase developer base
6
© JBoss Group, 2003. 6 Professional Open Source JDK 5.0 Annotations XDoclet like metadata, C#-like metatags –Typesafe, compiler-checked Syntax you can add to the Java language Metadata you can attach to class, method, field, constructor, or parameter –Metadata is compiled into class file –Available at compile time and/or runtime EJB 3.0 makes extensive use of annotations to replace XML
7
© JBoss Group, 2003. 7 Professional Open Source JDK 5.0 Annotations public @interface MyMetadata { String value() default “hello”; } ------------------------------------------------------------ import org.acme.MyMetadata; @MyMetadata(“stuff”) public class MyClass { @MyMetadata public void someMethod() {…} } public @interface MyMetadata { String value() default “hello”; } ------------------------------------------------------------ import org.acme.MyMetadata; @MyMetadata(“stuff”) public class MyClass { @MyMetadata public void someMethod() {…} }
8
Professional Open Source © JBoss Group, 2003. 8 15 October 2015 Session Beans Compare EJB 2.1 vs. EJB 3.0
9
© JBoss Group, 2003. 9 Professional Open Source EJB 2.1: Requirements Home interface Remote/Local interface Bean class must implement javax.ejb.SessionBean XML Deployment descriptor
10
© JBoss Group, 2003. 10 Professional Open Source EJB 2.1: Required Interfaces public interface CalculatorHome extends javax.ejb.EJBHome { public Calculator create() throws CreateException; } public interface Calculator extends EJBObject { Public int add(int x, int y) throws RemoteException; Public int subtract(int x, int y) throws RemoteException; } public interface CalculatorHome extends javax.ejb.EJBHome { public Calculator create() throws CreateException; } public interface Calculator extends EJBObject { Public int add(int x, int y) throws RemoteException; Public int subtract(int x, int y) throws RemoteException; } Homes for stateless beans unnecessary Remote interface must inherit from EJBObject Remote methods must throw RemoteException –Dependency on RMI
11
© JBoss Group, 2003. 11 Professional Open Source EJB 2.1: Bean class requirements public class CalculatorBean implements javax.ejb.Sessionbean { private SessionContext ctx; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void ejbCreate() { } public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { return x – y; } public class CalculatorBean implements javax.ejb.Sessionbean { private SessionContext ctx; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void ejbCreate() { } public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { return x – y; } Must extend verbose javax.ejb.SessionBean Unnecessary and verbose callback methods
12
© JBoss Group, 2003. 12 Professional Open Source EJB 2.1: XML Deployment Descriptor CalculatorBean org.acme.CalculatorHome org.acme.CalculatorBean org.acme.CalculatorRemote Stateless Container …. CalculatorBean org.acme.CalculatorHome org.acme.CalculatorBean org.acme.CalculatorRemote Stateless Container ….
13
© JBoss Group, 2003. 13 Professional Open Source EJB 3.0: Goals Remove unnecessary interfaces Remove unnecessary callbacks Make deployment descriptors optional Make beans pojo-like Use default values where they make sense
14
© JBoss Group, 2003. 14 Professional Open Source Required Interfaces @Remote public interface Calculator { public int add(int x, int y); public int subtract(int x, int y); } @Stateless Public class CalculatorBean implements Calculator { public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { Return x – y; } @Remote public interface Calculator { public int add(int x, int y); public int subtract(int x, int y); } @Stateless Public class CalculatorBean implements Calculator { public int add(int x, int y) { return x + y; } public int subtract(int x, int y) { Return x – y; } Homeless Methods don’t throw RemoteException No verbose interface implementations
15
© JBoss Group, 2003. 15 Professional Open Source EJB 3.0: XML Deployment Descriptor
16
© JBoss Group, 2003. 16 Professional Open Source Stateful Beans @Remote public interface ShoppingCart { public void addItem(int prodId, int quantity); public void checkout(); } @Stateful public class ShoppingCartBean implements ShoppingCart { @Remove public void checkout() { … } @Remote public interface ShoppingCart { public void addItem(int prodId, int quantity); public void checkout(); } @Stateful public class ShoppingCartBean implements ShoppingCart { @Remove public void checkout() { … } Still homeless –Created as they are looked up @Remove replaces EJBObject.remove Stateful bean is removed after method called
17
© JBoss Group, 2003. 17 Professional Open Source MDBs @MessageDriven( activation={ActivationSpecAttribute(name=“destinationType”, value=“javax.jms.queue”)}) public class EmailBean implements MessageListener { void onMessage(Message msg) { } public int add(int x, int y) { return x + y; } @MessageDriven( activation={ActivationSpecAttribute(name=“destinationType”, value=“javax.jms.queue”)}) public class EmailBean implements MessageListener { void onMessage(Message msg) { } public int add(int x, int y) { return x + y; } Just implements MessageListner XML turns to annotations Not-much new. Suggestions?
18
© JBoss Group, 2003. 18 Professional Open Source Transactions and Security @Stateful public class ShoppingCartBean implements ShoppingCart { @Remove @TransactionAttribute(REQUIRED) @MethodPermission({“valid_customer”}) public void checkout() { … } @Stateful public class ShoppingCartBean implements ShoppingCart { @Remove @TransactionAttribute(REQUIRED) @MethodPermission({“valid_customer”}) public void checkout() { … }
19
© JBoss Group, 2003. 19 Professional Open Source EJB 3.0: Dependency Injection Bean class specifies dependencies instead of lookup Facilitates Test Driven Development Possible to test EJBs outside of container @Stateful public class ShoppingCartBean implements ShoppingCart { @Inject private SessionContext ctx; @EJB(name=“CreditProcessorEJB”) private CreditCardProcessor processor; private DataSource jdbc; @Resource(jndiName=“java:/DefaultDS”) public void setDataSource(DataSource db) { this.jdbc = db; } } @Stateful public class ShoppingCartBean implements ShoppingCart { @Inject private SessionContext ctx; @EJB(name=“CreditProcessorEJB”) private CreditCardProcessor processor; private DataSource jdbc; @Resource(jndiName=“java:/DefaultDS”) public void setDataSource(DataSource db) { this.jdbc = db; } }
20
© JBoss Group, 2003. 20 Professional Open Source EJB 3.0: Callbacks on demand Callback methods still available Annotate on an as-needed basis @Stateless public class FacadeBean implements Facade { @EjbTimeout void licenseExpired(Timer t) {…} // committee is leaning towards this @PostCreate public void initialize() {} // currently in public draft } @Stateless public class FacadeBean implements Facade { @EjbTimeout void licenseExpired(Timer t) {…} // committee is leaning towards this @PostCreate public void initialize() {} // currently in public draft }
21
© JBoss Group, 2003. 21 Professional Open Source EJB 3.0 Deployment Descriptor Believe it or not, people like XML deployment descriptors Externalize configuration Externalize system architecture Although not in draft, XML DDs are optional Replace annotations with XML and you get pure POJOs
22
© JBoss Group, 2003. 22 Professional Open Source EJB 3.0 Deployment Descriptors @Remote public interface ShoppingCart { public void addItem(int prodId, int quantity); public void checkout(); } @Stateful public class ShoppingCartBean implements ShoppingCart { @Inject private EntityManager manager; … @Remove @TransactionAttribute(REQUIRED) @MethodPermission({“valid_customer”}) public void checkout() { … } @Remote public interface ShoppingCart { public void addItem(int prodId, int quantity); public void checkout(); } @Stateful public class ShoppingCartBean implements ShoppingCart { @Inject private EntityManager manager; … @Remove @TransactionAttribute(REQUIRED) @MethodPermission({“valid_customer”}) public void checkout() { … }
23
© JBoss Group, 2003. 23 Professional Open Source EJB 3.0 Deployment Descriptors public interface ShoppingCart { public void addItem(int prodId, int quantity); public void checkout(); } public class ShoppingCartBean implements ShoppingCart { private EntityManager manager; … public void checkout() { … } public interface ShoppingCart { public void addItem(int prodId, int quantity); public void checkout(); } public class ShoppingCartBean implements ShoppingCart { private EntityManager manager; … public void checkout() { … }
24
Professional Open Source © JBoss Group, 2003. 24 15 October 2015 Entity Beans POJO based persistence
25
© JBoss Group, 2003. 25 Professional Open Source Goals of Entity Beans Same goals as session beans –Fewer interfaces, optional XML DDs, etc. No required interfaces or subclassing Plain Java based –Allow new() Provide full Object/Relational mapping Supports Inheritance Expanded EJBQL –Fully featured –Parallel SQL –Polymorphic Queries
26
Professional Open Source © JBoss Group, 2003. 26 15 October 2015 Defining Entity Beans Full Object/Relational Database Mapping
27
© JBoss Group, 2003. 27 Professional Open Source EJB 3.0 Entity Beans O/R Mapping Metadata as annotations –Table mappings, @Table, @SecondaryTable –Column mappings, @Column, @JoinColumn –Relationships, @ManyToOne, @OneToOne, @OneToMany, @ManyToMany –Multi-Table mappings, @SecondaryTable –Embedded objects, @Dependent –Inheritance, @Inheritance, @DiscriminatorColumn –Identifier + Version properties, @Id, @Version
28
© JBoss Group, 2003. 28 Professional Open Source Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String productName; private Set bids = new HashSet(); private User seller; @Id(generate=GeneratorType.AUTO) @Column(name=“ITEM_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String productName; private Set bids = new HashSet(); private User seller; @Id(generate=GeneratorType.AUTO) @Column(name=“ITEM_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. relational table declaration auto-key generation
29
© JBoss Group, 2003. 29 Professional Open Source Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String productName; private Set bids = new HashSet(); private User seller; @Id(generate=GeneratorType.AUTO) @Column(name=“ITEM_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String productName; private Set bids = new HashSet(); private User seller; @Id(generate=GeneratorType.AUTO) @Column(name=“ITEM_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(255), ProductName varchar(255), USER_ID Number ); create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(255), ProductName varchar(255), USER_ID Number );
30
© JBoss Group, 2003. 30 Professional Open Source Entity Annotations @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String productName; private Set bids = new HashSet(); private Owner owner; @Id(generate=GeneratorType.AUTO) @Column(name=“ITEM_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. @Entity @Table(name=“AUCTION_ITEM”) public class Item { private long id; private String description; private String productName; private Set bids = new HashSet(); private Owner owner; @Id(generate=GeneratorType.AUTO) @Column(name=“ITEM_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(500), ProductName varchar(255), OWNER_ID Number ); create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(500), ProductName varchar(255), OWNER_ID Number );
31
© JBoss Group, 2003. 31 Professional Open Source Entity Annotations … @Column(name=“DESC”, length=500) public String getDescription() { return description; } public void setDescription(String desc) { this.description = desc; } public String getProductName() { return productName; } protected void setProductName(String name) { this.productName = name; } … … @Column(name=“DESC”, length=500) public String getDescription() { return description; } public void setDescription(String desc) { this.description = desc; } public String getProductName() { return productName; } protected void setProductName(String name) { this.productName = name; } … column mapping intuitive defaults
32
© JBoss Group, 2003. 32 Professional Open Source Entity Annotations … @Column(name=“DESC”, nullable=false, length=500) public String getDescription() { return description; } public void setDescription(String desc) { this.description = desc; } public String getProductName() { return productName; } protected void setProductName(String name) { this.productName = name; } … … @Column(name=“DESC”, nullable=false, length=500) public String getDescription() { return description; } public void setDescription(String desc) { this.description = desc; } public String getProductName() { return productName; } protected void setProductName(String name) { this.productName = name; } … create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(500), ProductName varchar(255), OWNER_ID Number ); create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(500), ProductName varchar(255), OWNER_ID Number );
33
© JBoss Group, 2003. 33 Professional Open Source Relationships Relationships, –@ManyToOne, @OneToOne, @OneToMany, @ManyToMany –Supports lazy and eager loading of relationships –Cascades: delete, create, and merge –No CMR: You must manage the relationships somewhat.
34
© JBoss Group, 2003. 34 Professional Open Source Entity Relationships @OneToOne(fetch=LAZY) @Column(name=“OWNER_ID”) public Owner getOwner() { return owner; } protected void setOwner(Owner owner) { this.owner = owner; } @OneToMany(cascade=ALL) @JoinColumn(name=“ITEM_ID”) protected Set getBids() { return bids; } protected void setBids(Set bids) { this.bids = bids; } @OneToOne(fetch=LAZY) @Column(name=“OWNER_ID”) public Owner getOwner() { return owner; } protected void setOwner(Owner owner) { this.owner = owner; } @OneToMany(cascade=ALL) @JoinColumn(name=“ITEM_ID”) protected Set getBids() { return bids; } protected void setBids(Set bids) { this.bids = bids; } various cascade types lazy/eager loading
35
© JBoss Group, 2003. 35 Professional Open Source Entity Relationships @OneToOne(fetch=LAZY) @Column(name=“OWNER_ID”) public Owner getOwner() { return owner; } protected void setOwner(Owner user) { this.owner = owner; } @OneToMany(cascade=ALL) @JoinColumn(name=“ITEM_ID”) protected Set getBids() { return bids; } protected void setBids(Set bids) { this.bids = bids; } @OneToOne(fetch=LAZY) @Column(name=“OWNER_ID”) public Owner getOwner() { return owner; } protected void setOwner(Owner user) { this.owner = owner; } @OneToMany(cascade=ALL) @JoinColumn(name=“ITEM_ID”) protected Set getBids() { return bids; } protected void setBids(Set bids) { this.bids = bids; } create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(255), ProductName varchar(255), OWNER_ID Number ); create table BID ( … ITEM_ID Number … ); create table AUCTION_ITEM ( ITEM_ID Number, DESC varchar(255), ProductName varchar(255), OWNER_ID Number ); create table BID ( … ITEM_ID Number … );
36
© JBoss Group, 2003. 36 Professional Open Source Multi-Table Multi-Table Mappings, –Entity can be stored in one or more tables –@SecondaryTables, @SecondaryTable
37
© JBoss Group, 2003. 37 Professional Open Source Multi-table Mappiings @Entity @Table(name=“OWNER”) @SecondaryTable(name=“ADDRESS” join={@JoinColumn(name=“ADDR_ID”)}) public class Owner { private long id; private String name; private String street; private String city; private String state; @Id(generate=GeneratorType.AUTO) @Column(name=“OWNER_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. @Entity @Table(name=“OWNER”) @SecondaryTable(name=“ADDRESS” join={@JoinColumn(name=“ADDR_ID”)}) public class Owner { private long id; private String name; private String street; private String city; private String state; @Id(generate=GeneratorType.AUTO) @Column(name=“OWNER_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } …. create table OWNER ( OWNER_ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) ); create table OWNER ( OWNER_ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) );
38
© JBoss Group, 2003. 38 Professional Open Source Multi-Table Mappings … @Column(name=“STREET”, secondaryTable=“ADDRESS”) public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @Column(name=“CITY”, secondaryTable=“ADDRESS”) public String getCity() { return city; } protected void setCity(String city) { this.city = city; } … … @Column(name=“STREET”, secondaryTable=“ADDRESS”) public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @Column(name=“CITY”, secondaryTable=“ADDRESS”) public String getCity() { return city; } protected void setCity(String city) { this.city = city; } … create table OWNER ( OWNER_ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) ); create table OWNER ( OWNER_ID Number, NAME varchar(255), ); create table ADDRESS ( ADDR_ID Number, STREET varchar(255), CITY varchar(255), STATE varchar(255) );
39
© JBoss Group, 2003. 39 Professional Open Source Embedded Objects Embedded Objects –Aggregated objects whose properties can be mapped –@Dependent, @DependentObject
40
© JBoss Group, 2003. 40 Professional Open Source Embedded Objects @Entity @Table(name=“OWNER”) public class Owner { private long id; private String name; private Address address; @Id(generate=GeneratorType.AUTO) @Column(name=“CUST_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } @Column(name=“NAME”) public String getName() { …. @Entity @Table(name=“OWNER”) public class Owner { private long id; private String name; private Address address; @Id(generate=GeneratorType.AUTO) @Column(name=“CUST_ID”) public long getId() { return id; } public void setId(long id) { this.id = id; } @Column(name=“NAME”) public String getName() { …. @DependentObject Public class Address { private String street; private String city; private String state; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } … @DependentObject Public class Address { private String street; private String city; private String state; public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } …
41
© JBoss Group, 2003. 41 Professional Open Source Entity Annotations … @Dependent({ @DependentAttribute(name=“street”, @Column(name=“STREET”)), @DependentAttribute(name=“city”, @Column(name=“CITY”)), @DependentAttribute(name=“state”, @Column(name=“STATE”))}) public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } … … @Dependent({ @DependentAttribute(name=“street”, @Column(name=“STREET”)), @DependentAttribute(name=“city”, @Column(name=“CITY”)), @DependentAttribute(name=“state”, @Column(name=“STATE”))}) public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } …
42
Professional Open Source © JBoss Group, 2003. 42 15 October 2015 Interacting With Entity Bean Plain Java Objects
43
© JBoss Group, 2003. 43 Professional Open Source Entity Manager Entities created as any plain Java object –Customer cust = new Customer(); Plain Java objects and homeless Can be detached and reattached to container –Can be serialized to remote client –Remote client can perform updates on local copy –Copy can be sent back to server and merged back in Persisted by the EntityManager service –All access through this service –Creation, retrieval, removal, and merging –Analogous to Hibernate Session
44
© JBoss Group, 2003. 44 Professional Open Source Create the objects Create the entities like you would any other object Allocate entire object graph like any other Java code Item item = new Item(); item.setDescription(“O’reilly’s EJB 4 th Edition”); item.setProductName(“EJB 2.1 Book”); … Owner bill = new Owner(); bill.setName(“Bill”); item.setOwner(bill); Bid bid = new Bid(); … HashSet bids = new HashSet(); bids.add(bid); item.setBids(bids); Item item = new Item(); item.setDescription(“O’reilly’s EJB 4 th Edition”); item.setProductName(“EJB 2.1 Book”); … Owner bill = new Owner(); bill.setName(“Bill”); item.setOwner(bill); Bid bid = new Bid(); … HashSet bids = new HashSet(); bids.add(bid); item.setBids(bids);
45
© JBoss Group, 2003. 45 Professional Open Source Entity Manager All entities persisted by the EntityManager service –All access through this service –Creation, retrieval, removal, and merging –Analogous to Hibernate Session Injected with dependency injection
46
© JBoss Group, 2003. 46 Professional Open Source EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } Inject the EntityManager service
47
© JBoss Group, 2003. 47 Professional Open Source EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } Item allocated remotely If cascade CREATE, entire object graph inserted into storage
48
© JBoss Group, 2003. 48 Professional Open Source EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } Item found with primary key Detached from persistent storage at tx completion Can be serialized like any other object
49
© JBoss Group, 2003. 49 Professional Open Source EntityManager @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } @Stateless public class ItemDAOImpl implements ItemDAORemote { @Inject private EntityManager em; public long create(Item item) { em.create(item); return item.getId(); } public Item findById(long id) { return (Item) em.find(Item.class, id); } public void merge(Item item) { em.merge(item); } Item can be updated remotely and merged back to persistent storage Item instance is reattached to storage with merge() call
50
© JBoss Group, 2003. 50 Professional Open Source Query API Queries may be expressed as EJBQL strings –Embedded in code –Externalized to metadata (named queries) Invoke via Query interface –Named parameter binding –Pagination control @Session public class ItemDAOImpl { … public List findByDescription(String description, int page) { return em.createQuery(“from Item i where i.description like :d”).setParameter(“d”, description).setMaxResults(50).setFirstResult(page*50).listResults(); } … @Session public class ItemDAOImpl { … public List findByDescription(String description, int page) { return em.createQuery(“from Item i where i.description like :d”).setParameter(“d”, description).setMaxResults(50).setFirstResult(page*50).listResults(); } …
51
© JBoss Group, 2003. 51 Professional Open Source EJB QL 3.0 EJBQL 3.0 is very similar to HQL (Hibernate Query Language) Aggregation, projection –select max(b.amount) from Bid b where b.item = :id –select new Name(c.first, c.last) from Customer c Fetching –from Item i left join fetch i.bids Subselects –from Item i join i.bids bid where bid.amount = (select max(b.amount) from i.bids b) Group By, Having, Joins
52
© JBoss Group, 2003. 52 Professional Open Source Inheritance Persistence mapping supports inheritance –Single table per hierarchy – SINGLE_TABLE –Join table per subclass – JOINED –Distinct table per subclass – UNION Queries on class hierarchy are polymorphic
53
© JBoss Group, 2003. 53 Professional Open Source Inheritance – SINGLE_TABLE @Entity @Table(name="Animal") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="TYPE") public class Animal { @Id private int id; @Column(name="AVG_WEIGHT") private int averageWeight;... } @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE ) public class Dog extends Animal{ @Column(name="BREED") private String breed;... } @Entity @Table(name="Animal") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="TYPE") public class Animal { @Id private int id; @Column(name="AVG_WEIGHT") private int averageWeight;... } @Entity @Inheritance(strategy=InheritanceType.SINGLE_TABLE ) public class Dog extends Animal{ @Column(name="BREED") private String breed;... }
54
© JBoss Group, 2003. 54 Professional Open Source Inheritance – SINGLE_TABLE create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number, BREED varchar(255) ); create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number, BREED varchar(255) );
55
© JBoss Group, 2003. 55 Professional Open Source Inheritance – JOINED @Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="TYPE") @Table(name="Animal") public class Animal{ @Id private int id; @Column(name="AVG_WEIGHT") private int averageWeight;... } @Entity @InheritanceJoinColumn(name="DOGGY_ID") @Table(name="Doggy") public class Dog extends Animal{ @Column(name="BREED") private String breed;... } @Entity @Inheritance(strategy=InheritanceType.JOINED) @DiscriminatorColumn(name="TYPE") @Table(name="Animal") public class Animal{ @Id private int id; @Column(name="AVG_WEIGHT") private int averageWeight;... } @Entity @InheritanceJoinColumn(name="DOGGY_ID") @Table(name="Doggy") public class Dog extends Animal{ @Column(name="BREED") private String breed;... }
56
© JBoss Group, 2003. 56 Professional Open Source Inheritance – JOINED create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number ); create table Doggy ( DOGGY_ID Number, BREED varchar(255) ); create table Animal ( ID Number, TYPE varchar(255), AVG_WEIGHT Number ); create table Doggy ( DOGGY_ID Number, BREED varchar(255) );
57
© JBoss Group, 2003. 57 Professional Open Source Inheritance – UNION create table Kitty ( ID Number, TYPE varchar(255), AVG_WEIGHT Number BREED varchar(255), LIVES Number ); create table Doggy ( DOGGY_ID Number, TYPE varchar(255), AVG_WEIGHT Number BREED varchar(255) ); create table Kitty ( ID Number, TYPE varchar(255), AVG_WEIGHT Number BREED varchar(255), LIVES Number ); create table Doggy ( DOGGY_ID Number, TYPE varchar(255), AVG_WEIGHT Number BREED varchar(255) );
58
Professional Open Source © JBoss Group, 2003. 58 15 October 2015 Upcoming Features Currently in committee
59
© JBoss Group, 2003. 59 Professional Open Source Interceptors Interceptors intercept calls Interceptors sit between caller and a session bean Analogous to servlet filters Can only be used with session and message driven beans Precursor to full aspect-oriented programming interceptor cart.buy(product) public class CartBean { public void buy(…) {} }
60
© JBoss Group, 2003. 60 Professional Open Source Why Interceptors Tracing Pluggable auditing Custom security Generic exception handling
61
© JBoss Group, 2003. 61 Professional Open Source Interceptors Interceptor is a plain Java class A method can be designated as the interceptor method –@AroundInvoke That method must return Object and throw Throwable That method must also accept an InvocationContext InvocationContext hold information about the request Request can be aborted with an exception Exceptions can be caught from the bean class and suppressed Return objects can be changed Arguments can be modified
62
© JBoss Group, 2003. 62 Professional Open Source Interceptors public class RuleBasedSecurityInterceptor { boolean checkRule(…) { …} @AroundInvoke public Object customSecurity(InvocationContext ctx) throws Exception { if (checkRule(…) == false) { throw new SecurityException(“Custom check failed”); } return ctx.proceed(); } public class RuleBasedSecurityInterceptor { boolean checkRule(…) { …} @AroundInvoke public Object customSecurity(InvocationContext ctx) throws Exception { if (checkRule(…) == false) { throw new SecurityException(“Custom check failed”); } return ctx.proceed(); }
63
© JBoss Group, 2003. 63 Professional Open Source Exception handling public class OracleExceptionHandlerInterceptor { public final static int ORACLE_DEADLOCK = …; @AroundInvoke public Object customSecurity(InvocationContext ctx) throws Exception { try { return ctx.proceed(); } catch (SQLException ex) { switch (ex.getErrorCode()) { case ORACLE_DEADLOCK: throw new DeadlockException(ex); … } public class OracleExceptionHandlerInterceptor { public final static int ORACLE_DEADLOCK = …; @AroundInvoke public Object customSecurity(InvocationContext ctx) throws Exception { try { return ctx.proceed(); } catch (SQLException ex) { switch (ex.getErrorCode()) { case ORACLE_DEADLOCK: throw new DeadlockException(ex); … }
64
© JBoss Group, 2003. 64 Professional Open Source Callback Listeners Similar to interceptors Intercept EJB callback methods in a separate class Can be attached to entities, sessions, or MDBs Callback Listener POST CREATE EVENT @Entity public class CartBean { @PostCreate public void initialize(…) {} }
65
© JBoss Group, 2003. 65 Professional Open Source Callback Listeners public class CallbackTracer { @PostCreate public void tracePosCreate() { log.trace(“postcreate”); } @PreUpdate public void tracePreUpdate { log.trace(“preupdate”); } … } public class CallbackTracer { @PostCreate public void tracePosCreate() { log.trace(“postcreate”); } @PreUpdate public void tracePreUpdate { log.trace(“preupdate”); } … }
66
© JBoss Group, 2003. 66 Professional Open Source JBoss Inc. EJB 3.0 Preview Available NOW! –Download at www.jboss.orgwww.jboss.org –Tutorial with code examples –Preview 3 due out end of month –Mostly functional 10% Discount for JUG members on all training EJB 3.0 training coming soon
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.