-
Is is possible for an EJB client
to marshal an object of class
java.lang.Class to an EJB? -
Technically yes, spec. compliant NO!
- The enterprise bean must not
attempt to query a class to obtain
information about the declared
members that are not otherwise
accessible to the enterprise bean
because of the security rules of the
Java language.
-
Is it legal to have static
initializer blocks in EJB? -
Although technically it is legal,
static initializer blocks are used
to execute some piece of code before
executing any constructor or method
while instantiating a class. Static
initializer blocks are also
typically used to initialize static
fields - which may be illegal in EJB
if they are read/write - In EJB this
can be achieved by including the
code in either the ejbCreate(),
setSessionContext() or
setEntityContext() methods.
-
Is it possible to stop the
execution of a method before
completion in a SessionBean? -
Stopping the execution of a method
inside a Session Bean is not
possible without writing code inside
the Session Bean. This is because
you are not allowed to access
Threads inside an EJB.
-
What is the default transaction
attribute for an EJB? - There is
no default transaction attribute for
an EJB. Section 11.5 of EJB v1.1
spec says that the deployer must
specify a value for the transaction
attribute for those methods having
container managed transaction. In
WebLogic, the default transaction
attribute for EJB is SUPPORTS.
-
What is the difference between
session and entity beans? When
should I use one or the other? -
An entity bean represents persistent
global data from the database; a
session bean represents transient
user-specific data that will die
when the user disconnects (ends his
session). Generally, the session
beans implement business methods
(e.g. Bank.transferFunds) that call
entity beans (e.g. Account.deposit,
Account.withdraw)
-
Is there any default cache
management system with Entity beans
? In other words whether a cache of
the data in database will be
maintained in EJB ? - Caching
data from a database inside the
Application Server are what Entity
EJB’s are used for.The ejbLoad() and
ejbStore() methods are used to
synchronize the Entity Bean state
with the persistent storage(database).
Transactions also play an important
role in this scenario. If data is
removed from the database, via an
external application - your Entity
Bean can still be “alive” the EJB
container. When the transaction
commits, ejbStore() is called and
the row will not be found, and the
transaction rolled back.
-
Why is ejbFindByPrimaryKey
mandatory? - An Entity Bean
represents persistent data that is
stored outside of the EJB
Container/Server. The
ejbFindByPrimaryKey is a method used
to locate and load an Entity Bean
into the container, similar to a
SELECT statement in SQL. By making
this method mandatory, the client
programmer can be assured that if
they have the primary key of the
Entity Bean, then they can retrieve
the bean without having to create a
new bean each time - which would
mean creating duplications of
persistent data and break the
integrity of EJB.
-
Why do we have a remove method in
both EJBHome and EJBObject? -
With the EJBHome version of the
remove, you are able to delete an
entity bean without first
instantiating it (you can provide a
PrimaryKey object as a parameter to
the remove method). The home version
only works for entity beans. On the
other hand, the Remote interface
version works on an entity bean that
you have already instantiated. In
addition, the remote version also
works on session beans (stateless
and stateful) to inform the
container of your loss of interest
in this bean.
-
How can I call one EJB from
inside of another EJB? - EJBs
can be clients of other EJBs. It
just works. Use JNDI to locate the
Home Interface of the other bean,
then acquire an instance reference,
and so forth.
-
What is the difference between a
Server, a Container, and a
Connector? - An EJB server is an
application, usually a product such
as BEA WebLogic, that provides (or
should provide) for concurrent
client connections and manages
system resources such as threads,
processes, memory, database
connections, network connections,
etc. An EJB container runs inside
(or within) an EJB server, and
provides deployed EJB beans with
transaction and security management,
etc. The EJB container insulates an
EJB bean from the specifics of an
underlying EJB server by providing a
simple, standard API between the EJB
bean and its container. A Connector
provides the ability for any
Enterprise Information System (EIS)
to plug into any EJB server which
supports the Connector architecture.
See
Sun’s J2EE Connectors
for more in-depth information on
Connectors.
-
How is persistence implemented in
enterprise beans? - Persistence
in EJB is taken care of in two ways,
depending on how you implement your
beans: container managed persistence
(CMP) or bean managed persistence
(BMP) For CMP, the EJB container
which your beans run under takes
care of the persistence of the
fields you have declared to be
persisted with the database - this
declaration is in the deployment
descriptor. So, anytime you modify a
field in a CMP bean, as soon as the
method you have executed is
finished, the new data is persisted
to the database by the container.
For BMP, the EJB bean developer is
responsible for defining the
persistence routines in the proper
places in the bean, for instance,
the ejbCreate(), ejbStore(),
ejbRemove() methods would be
developed by the bean developer to
make calls to the database. The
container is responsible, in BMP, to
call the appropriate method on the
bean. So, if the bean is being
looked up, when the create() method
is called on the Home interface,
then the container is responsible
for calling the ejbCreate() method
in the bean, which should have
functionality inside for going to
the database and looking up the
data.
-
What is an EJB Context? -
EJBContext is an interface that is
implemented by the container, and it
is also a part of the bean-container
contract. Entity beans use a
subclass of EJBContext called
EntityContext. Session beans use a
subclass called SessionContext.
These EJBContext objects provide the
bean class with information about
its container, the client using the
bean and the bean itself. They also
provide other functions. See the API
docs and the spec for more details.
-
Is method overloading allowed in
EJB? - Yes you can overload
methods
-
Should synchronization primitives
be used on bean methods? - No.
The EJB specification specifically
states that the enterprise bean is
not allowed to use thread
primitives. The container is
responsible for managing concurrent
access to beans at runtime.
-
Are we allowed to change the
transaction isolation property in
middle of a transaction? - No.
You cannot change the transaction
isolation level in the middle of
transaction.
-
For Entity Beans, What happens to
an instance field not mapped to any
persistent storage, when the bean is
passivated? - The specification
infers that the container never
serializes an instance of an Entity
bean (unlike stateful session
beans). Thus passivation simply
involves moving the bean from the
“ready” to the “pooled” bin. So what
happens to the contents of an
instance variable is controlled by
the programmer. Remember that when
an entity bean is passivated the
instance gets logically
disassociated from it’s remote
object. Be careful here, as the
functionality of passivation/activation
for Stateless Session, Stateful
Session and Entity beans is
completely different. For entity
beans the ejbPassivate method
notifies the entity bean that it is
being disassociated with a
particular entity prior to reuse or
for dereference.
-
What is a Message Driven Bean,
what functions does a message driven
bean have and how do they work in
collaboration with JMS? -
Message driven beans are the latest
addition to the family of component
bean types defined by the EJB
specification. The original bean
types include session beans, which
contain business logic and maintain
a state associated with client
sessions, and entity beans, which
map objects to persistent data.
Message driven beans will provide
asynchrony to EJB based applications
by acting as JMS message consumers.
A message bean is associated with a
JMS topic or queue and receives JMS
messages sent by EJB clients or
other beans. Unlike entity beans and
session beans, message beans do not
have home or remote interfaces.
Instead, message driven beans are
instantiated by the container as
required. Like stateless session
beans, message beans maintain no
client-specific state, allowing the
container to optimally manage a pool
of message-bean instances. Clients
send JMS messages to message beans
in exactly the same manner as they
would send messages to any other JMS
destination. This similarity is a
fundamental design goal of the JMS
capabilities of the new
specification. To receive JMS
messages, message driven beans
implement the
javax.jms.MessageListener interface,
which defines a single “onMessage()”
method. When a message arrives, the
container ensures that a message
bean corresponding to the message
topic/queue exists (instantiating it
if necessary), and calls its
onMessage method passing the
client’s message as the single
argument. The message bean’s
implementation of this method
contains the business logic required
to process the message. Note that
session beans and entity beans are
not allowed to function as message
beans.
-
Does RMI-IIOP support code
downloading for Java objects sent by
value across an IIOP connection in
the same way as RMI does across a
JRMP connection? - Yes. The JDK
1.2 support the dynamic class
loading.
-
The EJB container implements the
EJBHome and EJBObject classes. For
every request from a unique client,
does the container create a separate
instance of the generated EJBHome
and EJBObject classes? - The EJB
container maintains an instance
pool. The container uses these
instances for the EJB Home reference
irrespective of the client request.
while refering the EJB Object
classes the container creates a
separate instance for each client
request. The instance pool
maintainence is up to the
implementation of the container. If
the container provides one, it is
available otherwise it is not
mandatory for the provider to
implement it. Having said that, yes
most of the container providers
implement the pooling functionality
to increase the performance of the
application server. The way it is
implemented is again up to the
implementer.
-
What is the advantage of putting
an Entity Bean instance from the
“Ready State” to “Pooled state”?
- The idea of the “Pooled State” is
to allow a container to maintain a
pool of entity beans that has been
created, but has not been yet
“synchronized” or assigned to an
EJBObject. This mean that the
instances do represent entity beans,
but they can be used only for
serving Home methods (create or
findBy), since those methods do not
relay on the specific values of the
bean. All these instances are, in
fact, exactly the same, so, they do
not have meaningful state. Jon
Thorarinsson has also added: It can
be looked at it this way: If no
client is using an entity bean of a
particular type there is no need for
cachig it (the data is persisted in
the database). Therefore, in such
cases, the container will, after
some time, move the entity bean from
the “Ready State” to the “Pooled
state” to save memory. Then, to save
additional memory, the container may
begin moving entity beans from the
“Pooled State” to the “Does Not
Exist State”, because even though
the bean’s cache has been cleared,
the bean still takes up some memory
just being in the “Pooled State”.
-
Can a Session Bean be defined
without ejbCreate() method? -
The ejbCreate() methods is part of
the bean’s lifecycle, so, the
compiler will not return an error
because there is no ejbCreate()
method. However, the J2EE spec is
explicit: the home interface of a
Stateless Session Bean must have a
single create() method with no
arguments, while the session bean
class must contain exactly one
ejbCreate() method, also without
arguments. Stateful Session Beans
can have arguments (more than one
create method) stateful beans can
contain multiple ejbCreate() as long
as they match with the home
interface definition. You need a
reference to your EJBObject to
startwith. For that Sun insists on
putting a method for creating that
reference (create method in the home
interface). The EJBObject does
matter here. Not the actual bean.
-
Is it possible to share an
HttpSession between a JSP and EJB?
What happens when I change a value
in the HttpSession from inside an
EJB? - You can pass the
HttpSession as parameter to an EJB
method, only if all objects in
session are serializable.This has to
be consider as “passed-by-value”,
that means that it’s read-only in
the EJB. If anything is altered from
inside the EJB, it won’t be
reflected back to the HttpSession of
the Servlet Container.The
“pass-by-reference” can be used
between EJBs Remote Interfaces, as
they are remote references. While it
IS possible to pass an HttpSession
as a parameter to an EJB object, it
is considered to be “bad practice
(1)” in terms of object oriented
design. This is because you are
creating an unnecessary coupling
between back-end objects (ejbs) and
front-end objects (HttpSession).
Create a higher-level of abstraction
for your ejb’s api. Rather than
passing the whole, fat, HttpSession
(which carries with it a bunch of
http semantics), create a class that
acts as a value object (or
structure) that holds all the data
you need to pass back and forth
between front-end/back-end. Consider
the case where your ejb needs to
support a non-http-based client.
This higher level of abstraction
will be flexible enough to support
it. (1) Core J2EE design patterns
(2001)
-
Is there any way to read values
from an entity bean without locking
it for the rest of the transaction
(e.g. read-only transactions)? We
have a key-value map bean which
deadlocks during some concurrent
reads. Isolation levels seem to
affect the database only, and we
need to work within a transaction.
- The only thing that comes to (my)
mind is that you could write a
‘group accessor’ - a method that
returns a single object containing
all of your entity bean’s attributes
(or all interesting attributes).
This method could then be placed in
a ‘Requires New’ transaction. This
way, the current transaction would
be suspended for the duration of the
call to the entity bean and the
entity bean’s fetch/operate/commit
cycle will be in a separate
transaction and any locks should be
released immediately. Depending on
the granularity of what you need to
pull out of the map, the group
accessor might be overkill.
-
What is the difference between a
“Coarse Grained” Entity Bean and a
“Fine Grained” Entity Bean? - A
‘fine grained’ entity bean is pretty
much directly mapped to one
relational table, in third normal
form. A ‘coarse grained’ entity bean
is larger and more complex, either
because its attributes include
values or lists from other tables,
or because it ‘owns’ one or more
sets of dependent objects. Note that
the coarse grained bean might be
mapped to a single table or flat
file, but that single table is going
to be pretty ugly, with data copied
from other tables, repeated field
groups, columns that are dependent
on non-key fields, etc. Fine grained
entities are generally considered a
liability in large systems because
they will tend to increase the load
on several of the EJB server’s
subsystems (there will be more
objects exported through the
distribution layer, more objects
participating in transactions, more
skeletons in memory, more EJB
Objects in memory, etc.)
-
What is EJBDoclet? -
EJBDoclet is an open source JavaDoc
doclet that generates a lot of the
EJB related source files from custom
JavaDoc comments tags embedded in
the EJB source file.
|
|
|