Tutorial for CMP2.0 entity bean mapping?
Hi folks,
I've found some decent resources on the web for most of EJB 2.0 bean creation, BUT I'm having a hard time figuring out how to map bean fields to table columns, beans to tables, and the overall bean to a particular database.
The latter I believe is still app server specific but the former two I believe are now supposed to be standard. The only thing I've found on the java site basically said 'use a deploy tool to create the xml' - I'd rather find a tutorial that explains what the xml is so I understand it better.
Thanks,
mike
actually all three things are parts of the same process, and the process is app.server/deployment tool specific
all of such mapping information is usually placed into application server specific deployment descriptors (or dd extensions as they are sometimes called)
look at the documentation of you app. server
Similar Messages
-
Entity bean mapping to multiple tables.
Hello,
Is it possible to map several tables with only one BMP?
if so please send me an example (class bean)
Thanks in advancehi,
yes, entity bean can be mapped to multiple tables provided it is bean managed entity bean.
since, container cannot prepare complex quries so that we need to rely on bean managed persistance.
Ex : Assume you have two table like X, Y
where X table having fields (int x primarykey, varchar str) and Y table having fields (varchar name primarykey, int y).
Now you should design a primary key class of your own as shown below:
public class BeanPriamkey implements java.io.Serializable
protected int x;
protected String name;
public BeanPramkey()
//initialzation part
public BeanPramkey(int x,String str)
//initialzation part
public String toString()
//return object value as string
public int hashCode()
//return an int value
public boolean equals(BeanPramkey)
public int getX()
return x;
public String getStr()
return str;
now your entity bean would be like this
public class Mybean implements EntityBean
int x,y;
String str,name;
BeanPriamkey primekey;
public BeanPrrmkey ejbCreate(int x,String name)
//fetch the rows from the tables X and Y ;
//if the rows exists int the tables create beanprimkey object with x and name and return refernce of the Beanprimkey class object
public BeanPrimkey findByPrimarykey(BeanPrimkey )
//first extract values of x and str from BeanPrimkey
and chek X and Y table for corresponding rows if exists return the reference of BeanPrimkey else return null
public void ejbStore()
BeanPrimkey prikey = (BeanPrimkey) entityContext.getPrimarykey();
int x = prikey.getX();
String st = prikey.getStr();
update X and Y tables using x and str;
public void ejbLoad()
BeanPrimkey prikey = (BeanPrimkey) entityContext.getPrimarykey();
int x = prikey.getX();
String st = prikey.getStr();
fetch the rows from X and Y tables using x and str;
and assing the row values to bean instance variables.
public void ejbPassivate()
//code for release the resources
public void ejbActivate()
//code for aquiring the resource
public void setEntityContext(EntityContext ec)
this.ec = ec;
protected EntityContext ec; -
Load balancing not happending but fail over is for Read only Entity beans
The following are the configuration.
Two NT servers with WL5.1 sp9 having only EJBs(Read only entity beans)
One Client with WL5.1 sp9 having servlet/java application as
EJB client.
I am trying to make a call like findbyprimarykey in one of the
entity bean. I could see the request is being directed only to the one of the
server always. When I bring that server, fail over is happening to the other server.
Here are the settings I have in the ejb-jar.xml :
<entity>
<ejb-name>device.StartHome</ejb-name>
<home>com.wl.api.device.StartHome</home>
<remote>com.wl.api.device.StartRemote</remote>
<ejb-class>com.wl.server.device.StartImpl</ejb-class>
<persistence-type>Bean</persistence-type>
<prim-key-class>java.lang.Long</prim-key-class>
<reentrant>False</reentrant>
<resource-ref>
<res-ref-name>jdbc/wlPool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</entity>
Here are the settings I have in the weblogic-ejb-jar.xml.
<weblogic-enterprise-bean>
<ejb-name>device.StartHome</ejb-name>
<caching-descriptor>
<max-beans-in-cache>50</max-beans-in-cache>
<cache-strategy>Read-Only</cache-strategy>
<read-timeout-seconds>900</read-timeout-seconds>
</caching-descriptor>
<reference-descriptor>
<resource-description>
<res-ref-name>jdbc/wlPool</res-ref-name>
<jndi-name>weblogic.jdbc.pool.wlPool</jndi-name>
</resource-description>
</reference-descriptor>
<enable-call-by-reference>False</enable-call-by-reference>
<jndi-name>device.StartHome</jndi-name>
</weblogic-enterprise-bean>
Am I doin any mistake in this?
Any one's help is appreciated.
Thanks
Suresh
we are using 5.1
"Gene Chuang" <[email protected]> wrote in message
news:[email protected]...
> Colocation optimization occurs if your client resides in the same
container (and also in the same
> EAR for 6.0) as your ejbs.
>
> Gene
>
> "Suresh" <[email protected]> wrote in message
news:[email protected]...
> > Ok....the ejb-call-by-reference set to true is making the call to one
server
> > only. i am not sure why it is. I removed the property name and it
works.
> > Also I have one question, in our prduct environment, when i cache the
ejb
> > home it is not doing the load balancing. can any one help me for that.
> > thanks
> >
> > Mike,
> > From the sample pgm I sent, even from single client calls get load
> > balanced.
> >
> > Suresh
> >
> >
> > "Gene Chuang" <[email protected]> wrote in message
> > news:[email protected]...
> > > In WL, LoadBalancing will ONLY WORK if you reuse your EJBHome! Take
your
> > StartEndPointHome lookup
> > > out of your for loop and see if this fixes your problem.
> > >
> > > I've seen this discussion in ejb-interest, and some other vendor
(Borland,
> > I believe it is), brings
> > > up an interesting point: Clustering and LoadBalance is not in the
J2EE
> > specs, hence implementation
> > > is totally up to the vendor. Weblogic loadbalances from the remote
> > interfaces (EJBObject, EJBHome,
> > > etc..), while Borland loadbalances from JNDI Context lookup.
> > >
> > > Let me suggest a third implmentation: loadbalance from BOTH Context
> > lookup as well as stub method
> > > invocation! Or create a smart replica-aware list manager which
persists
> > on the client thread
> > > (ThreadLocal) and is aware of lookup/evocation history. Hence if I do
the
> > following in a client
> > > hitting a 3 node cluster, I'll still get perfect round-robining
regardless
> > of what I do on the
> > > client side:
> > >
> > > InitialContext ctxt = new InitialContext();
> > > EJBHome myHome = ctxt.lookup(MY_BEAN);
> > > myHome.findByPrimaryKey(pk); <== hits Node #1
> > > myHome = ctxt.lookup(MY_BEAN);
> > > myHome.findByPrimaryKey(pk); <== hits Node #2
> > > myHome.findByPrimaryKey(pk); <== hits Node #3
> > > myHome = ctxt.lookup(MY_BEAN);
> > > myHome.findByPrimaryKey(pk); <== hits Node #1
> > > ...
> > >
> > >
> > > Gene
> > >
> > > "Suresh" <[email protected]> wrote in message
> > news:[email protected]...
> > > > Mike ,
> > > >
> > > > Do you have any reasons for the total number of machines to be 10.
> > > >
> > > > I tried with 7 machines.
> > > >
> > > >
> > > > Here is my sample client java application running individual in the
> > seven
> > > > machines.
> > > >
> > > > StartEndPointHome =
> > > > (StartEndPointHome)ctx.lookup("dev.StartEndPointHome");
> > > > for(;;)
> > > > {
> > > > // logMsg(" --in loop "+currentTime);
> > > > if (currentTime > nextRefereshTime)
> > > > {
> > > > logMsg("****- going to call");
> > > > currentTime=getSystemTime();
> > > > nextRefereshTime=currentTime+timeInterval;
> > > > StartEndPointHome =
> > > > (StartEndPointHome)ctx.lookup("dev.StartEndPointHome");
> > > > long rndno=(long)(Math.random()*10)+range;
> > > > logMsg(" going to call remotestub"+rndno);
> > > > retVal =
> > > >
> >
((StartEndPointHome)getStartHome()).findByNumber("pe"+rndno+"_mportal_dsk36.
> > > > mportal.com");
> > > >
> > > > logMsg("**++- called stub");
> > > > }
> > > >
> > > >
> > > >
> > > > The range value is different for each of the machines in the
cluster.
> > > >
> > > > If the first request starts at srv1, all request starts hitting the
same
> > > > server.
> > > > If the first request starts at srv2, all request starts hitting the
same
> > > > server.
> > > >
> > > > I have the following for the url , user and pwd values for the
context
> > .
> > > >
> > > > public static String url="t3://10.11.12.14,10.11.12.117:8000";
> > > > public static String user="guest";
> > > > public static String password="guest";
> > > >
> > > >
> > > >
> > > > It would be great if you could help me.
> > > >
> > > > Thanks
> > > > suresh
> > > >
> > > >
> > > > "Mike Reiche" <[email protected]> wrote in message
> > > > news:[email protected]...
> > > > >
> > > > > If you have only one client don't be surprised if you only hit one
> > server.
> > > > Try
> > > > > running ten different clients and see if the hit the same server.
> > > > >
> > > > > Mike
> > > > >
> > > > >
> > > > > "suresh" <[email protected]> wrote:
> > > > > >
> > > > > >The following are the configuration.
> > > > > >
> > > > > > Two NT servers with WL5.1 sp9 having only EJBs(Read only entity
> > beans)
> > > > > >
> > > > > > One Client with WL5.1 sp9 having servlet/java application as
> > > > > > EJB client.
> > > > > >
> > > > > >
> > > > > >I am trying to make a call like findbyprimarykey in one of the
> > > > > >entity bean. I could see the request is being directed only to
the
> > one
> > > > > >of the
> > > > > >server always. When I bring that server, fail over is happening
to
> > the
> > > > > >other server.
> > > > > >
> > > > > >
> > > > > >Here are the settings I have in the ejb-jar.xml :
> > > > > > <entity>
> > > > > > <ejb-name>device.StartHome</ejb-name>
> > > > > > <home>com.wl.api.device.StartHome</home>
> > > > > > <remote>com.wl.api.device.StartRemote</remote>
> > > > > > <ejb-class>com.wl.server.device.StartImpl</ejb-class>
> > > > > > <persistence-type>Bean</persistence-type>
> > > > > > <prim-key-class>java.lang.Long</prim-key-class>
> > > > > > <reentrant>False</reentrant>
> > > > > > <resource-ref>
> > > > > > <res-ref-name>jdbc/wlPool</res-ref-name>
> > > > > > <res-type>javax.sql.DataSource</res-type>
> > > > > > <res-auth>Container</res-auth>
> > > > > > </resource-ref>
> > > > > > </entity>
> > > > > >
> > > > > >
> > > > > >Here are the settings I have in the weblogic-ejb-jar.xml.
> > > > > >
> > > > > ><weblogic-enterprise-bean>
> > > > > > <ejb-name>device.StartHome</ejb-name>
> > > > > >
> > > > > > <caching-descriptor>
> > > > > > <max-beans-in-cache>50</max-beans-in-cache>
> > > > > > <cache-strategy>Read-Only</cache-strategy>
> > > > > > <read-timeout-seconds>900</read-timeout-seconds>
> > > > > > </caching-descriptor>
> > > > > >
> > > > > > <reference-descriptor>
> > > > > > <resource-description>
> > > > > > <res-ref-name>jdbc/wlPool</res-ref-name>
> > > > > > <jndi-name>weblogic.jdbc.pool.wlPool</jndi-name>
> > > > > > </resource-description>
> > > > > > </reference-descriptor>
> > > > > > <enable-call-by-reference>False</enable-call-by-reference>
> > > > > > <jndi-name>device.StartHome</jndi-name>
> > > > > > </weblogic-enterprise-bean>
> > > > > >
> > > > > >
> > > > > >Am I doin any mistake in this?
> > > > > >
> > > > > >Any one's help is appreciated.
> > > > > >Thanks
> > > > > >Suresh
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>
-
Primary Key for Read Only Entity Beans In EJB 3.0
Hi,
I have checked the spec for ejb 3.0 which mentions that, there is no common standard for the vendor to implement the Read only Entity Beans.
My question over here is how it is implemented in OC4J??
Do we need to specify a primary key attribute in the read-only entity bean?
w.r.t BC4J(ADF) i remember, we used to create a read-only View Object with out specifying a primary key.
Just want to check is that the way it works in EJB 3.0 (Implemented by OC4J).
Thanks for your help in advance.
ShivaHi,
Try using the JBoss embedded container:
http://docs.codehaus.org/display/MAVENUSER/How+to+use+the+JBoss+Embedded+EJB3+Container+for+Unit+testing
/klejs -
Finder error in WL generated Stub code for a BMP Entity Bean
Hi,
I have a group finder error in a BMP I am writing in WL 6.1 sp3.... The
group finder is...
public Collection ejbFindByDocumentKey(DocumentPK docKey) {.....
.... // get a record set of all the interesting keys....
ArrayList retVal = new ArrayList();
while(rs.next()) {
int subDocNum = rs.getInt(1);
SubDocPK subDocPK = new SubDocPK(subDocNum);
retVal.add(subDocPK);
return retVal;
..... // Exception handling
Which works fine in the debugger, but in the session facade when I get an
Iterator on the Collection and cast the result to a SubDocPK I get a
ClassCastException. When I look at the type of the class in the Collection
returned by the container it is SubDocBean_mjdk3_EOimpl (I cannot remember
the exact name as it was at work and I am now at home)
Has anyone else found this problem or a way around, or should I just write a
DAO and get the collection myself?
Yours
Paul BrennanRight, this is how finders work in BMP.
The ejbFindXXX implementation returns a collection of primary keys. The
container then takes this and returns a collection of remote or local
references.
-- Rob
Paul Brennan wrote:
Hi all,
Just got into work and I want to add that the class inside the collection is a
cdcp.ejb.cdcp.SubDocPK
as below; and when I look in the session bean I get a type
cdcp.ejb.cdcp.SubDocBean_jktqi5_ELOImpl
I have an EAR file I am willing to share....
Any comments or suggestions are welcom
"Paul Brennan" <[email protected]> wrote:
Hi,
I have a group finder error in a BMP I am writing in WL 6.1 sp3....
The
group finder is...
public Collection ejbFindByDocumentKey(DocumentPK docKey) {.....
.... // get a record set of all the interesting keys....
ArrayList retVal = new ArrayList();
while(rs.next()) {
int subDocNum = rs.getInt(1);
SubDocPK subDocPK = new SubDocPK(subDocNum);
retVal.add(subDocPK);
return retVal;
..... // Exception handling
Which works fine in the debugger, but in the session facade when I get
an
Iterator on the Collection and cast the result to a SubDocPK I get a
ClassCastException. When I look at the type of the class in the Collection
returned by the container it is SubDocBean_mjdk3_EOimpl (I cannot remember
the exact name as it was at work and I am now at home)
Has anyone else found this problem or a way around, or should I just
write a
DAO and get the collection myself?
Yours
Paul Brennan -
Is it possible to map the cmp fields of the entity bean with out dictionary
Dear sirs,
I have created the EJB project module and WEB Module. Now i have to map the CMP fields of the entity bean to the underlying table. Is it possible to map the cmp fields of the entity bean with out java dictionary? If yes how can we do that.
I have got some error while mapping an EJB's CMP fields to the table through dictionary. I was actually intended to map 79 fields but it gives an error that more than 64 fields are not allowed while building the dictionary.
1. Can you tell me what could be the possible reason?
2. Is it possible to map the cmp fields of the entity bean with out java dictionary? If yes how can we do that.
Kindly helo me,
Sudheesh K SHi,
Sudheesh please check up if the below link helps,there are other ways of writing the persistent.xml for container managed entity bean.
http://help.sap.com/saphelp_nw04s/helpdata/en/9b/f695f0c84acf46a4e0b31f69d8a9b7/frameset.htm, probably in the studio you cannot browse through tables not in the java dictionary,but manually editing it may still solve the problem.
Also here is another link that specifies the databases supported by J2EE Engine.
http://help.sap.com/saphelp_nw04s/helpdata/en/66/a5283eeb47b40be10000000a114084/frameset.htm
The below link shows how to specify the database vendor and datasource
http://help.sap.com/saphelp_nw04s/helpdata/en/e1/67fc3ee241ba28e10000000a114084/frameset.htm
Hope you are able to solve the problem.
Do let us know if you come up with the solution.
Regards,
Harish
Message was edited by: HARISH SUBRAMANIAN -
Re: junit test for entity beans ... ejb 3.0
I'm confused. I'm trying to test my entity bean.
I have:
- an entity bean
- a stateless session bean for accessing the entity bean (facade)
- an interface for accessing the the stateless bean
And I'm trying to write a JUnit test class to test this bean. However, I am uncertain as to how to test this (I'm new to EJB 3.0, JBoss and Eclipse).
What would the JUnit test look like? I'm confused as to whether or not I should be injecting the interface/bean/what???
I've tried several variations. I either get "NameNotFound" - not bound exceptions or Null pointer exceptions.
What would the @EJB syntax look like or how would I do it through the context?
For Example:
@EJB private TestFacade myTest; //interface to stateless bean ?
OR
InitialContext ctx = new InitialContext();
TestResultFacadeBean myTest = (TestResultFacadeBean) ctx.lookup("localTest");
I'm confused at to which method I should be using and what object I should be accessing. If I could get either one to work, I'd be happy. :)
How do I ensure my bean is deployed to the container? What do I need to do?
If anyone has a simple example or explanation as to which method I should use and how to use it, I'd be very grateful.
Thanks very much,
LisaDOK, you need to have several layers of testing.
Layer 0. Test the entity beans are deployable (more on this later). Basically, you need to know that all your annotations work. Things to watch out for are multiple @Id fields in one class or @EmbeddedID or @IdClass in conjuction with @ManyToOne, @ManyToMany, @OneToMany, @OneToOne and fun with @JoinTable, @JoinColumn and @JoinColumns. Once you know how these are supposed to work with the spec, it's not too bad to write it correctly each time. But there are some gotchas that will break things later on.
Layer 1. Do the functions in the classes that don't depend on annotations work as expected. Typically, this is just going to be the getters and setters in your entity classes. Of course JUnit best practice says we don't bother testing functions that look like:
public T getX() {
return this.x;
or
public void setX(T x) {
this.x = x;
as there is nothing that can go wrong with them. So in that case, your level 1 tests will just be initial values specified from constructors and verifying that the non-get/set pairs work, and that the getters you have tagged @Transient work (because you've likely put some logic in them)
Layer 2. Test the session bean methods that don't require injection to work.
Layer 3. Test the session bean methods that require injection (Mock Objects). Simulate the injection for yourself, injecting Mock Objects for the entity manager. Then you can confirm that the correct methods are being called in the correct sequences, etc.
[Note this may require some skill in designing the mock. I'm working on developing my own entitymanager mock, and if it looks usefull I'll release it to the world.
Layer 4. Test the session bean methods that require injection (Real entity manager) (See Layer 0)
For this you will need an out of container persistence implementation. Currently Hibernate and Glassfish provide beta versions. You will need a different persistence.xml file that lists all the entities. You will have to use reflection to inject the entity manager(s) that you create from an entity manager factory unless you provide a constructor that takes an EntityManager as a parameter. You may need to use reflection to call any @PostConstruct method if you made it private.
Layer 5. Navigate the relationships in the objects returned from Layer 4 using a database that has been loaded with test data.
I am currently using Layers 0, 1, 2 & 4 to test my session beans and entity beans. -
Using oracle db sequence for auto generating of PKs for CMP entity beans
Hi,
I have read quite a number of threads about (auto) generation of keys for primary keys for the CMP entity beans.
My requirement is I am migrating an application deployed on Weblogic to oc4j. The application is using cmp entity beans with auto key generation using a sequence in the Oracle db. This is specified in weblogic-cmp-rdbms-jar.xml file like below:
<automatic-key-generation>
<generator-type>Oracle</generator-type>
<generator-name>REPUSER.DEPT_REPORT_SEQ</generator-name>
<key-cache-size>1</key-cache-size>
</automatic-key-generation>
In the ejb-jar.xml, it is specified as:
<prim-key-class>java.lang.Integer</prim-key-class>
<primkey-field>id</primkey-field>
Now, I need to migrate this to oc4j. Can somebody suggest me options and clarify my questions kindly?
1) I have read articles that say that in the ejb-jar.xml, we need to specify <prim-key-class>java.lang.Object</prim-key-class> and this will create a column called 'autoid' in the respective entity table in the Oracle db.
- How can I use this to assign the value to my primary field, say, id?
2) Now, with the latest oc4j, can I use Oracle database sequence as the key generator for the values of the PKs just by specifying in the xml descriptor ejb-jar.xml?
2.a) If yes, is there any article that explains with the code?
2.b) If no, what are the alternatives I have?
I have read many discussions that say that we can create a stateless session bean that can lookup the database sequence using simple JDBC call to return the nextval of the sequence. The SSB should be called in the ejbCreate() of the entity bean.
My related question is, what is recommended for oc4j? What are limitations of the various options for the latest oc4j available?
How should I go about deploying this kind of ejbs in oc4j?
Any help and pointers are welcome. Please help.
Thanks a lot.
VadiHello ,
Instead of exposing a get/set method for each arribute of your bean (corresponding to database table) expose only one object.
For example
public class CustomerBean implements javax.ejb.EntityBean{
private CustomerVO objCustomer;
private String customerName;
private String customerMail;
private String customerType;
public CustomerVO getCustomer(){
return this.objCustomer;
public void setCustomer(CustomerVO objCustomer){
this.objCustomer = objCustomer;
public void ejbStore(){
customerName = objCustomer.getName();
customerMail = objCustomer.getMail();
customerType = objCustomer.getType();
HTH
VJ -
Hi:
I am using Weblogic 8.1 and also weblogic 9.2.
Can anybody tells me if there is a tool that map the database to the ejb-jar.xml,weblogic-cmp-rdbms-jar.xml and weblogic-ejb-jar.xml files.
In other words, given a particular database, is there a tool that generates the ejb-jar.xml, weblogic-cmp-rdbms-jar.xml and weblogic-ejb-jar.xml files.
Yours,
Frustrated."Local interfaces provide the foundation for container-managed relationships among entity beans and session beans. The bean uses the local interface to maintain its references to other beans. For example, an entity bean uses its local interfaces to maintain relationships to other entity beans. Using local interfaces, beans can also expose their state and use pass-by-reference to pass their state between related bean instances. "
http://java.sun.com/developer/technicalArticles/ebeans/EJB20CMP/ -
Entity Beans deployed on JBOSS
We have a Web application in our project that includes 6 Entity Beans with CMP fields1.1
The application was developed in WSAD 5.1
The WSAD generates Access Beans for each Entity Bean as well as stubs in default package com.ibm.ejs.container and com.ibm.websphere.csi.
E.g. The Entity Bean �Organization.java� has Access Bean �OrganizationAccessBean.java�.
Similarly for other 5 Entity Beans there are Access Beans created in WSAD.
But now we are migrating the application to JBOSS 4.0.3SP1 server.
The EAR of the application exported from the WSAD contains all the deployed code (stubs) and Access Beans.
When this EAR was imported in Eclipse 3.2, it gave us error as it does not support the IBM specific files.
We have replaced the IBM specific �.xmi� files by JBOSS compatible files like ejb-jar.xml, jboss.xml.
Then a mapping file was created with the name jbosscmp-jdbc.xml which has all the mapping between the beans and the tables in the database.
Also this file contains the relationship between the beans.
After this we tried deploying the code on JBOSS but got some errors as mentioned below:
Error:
12:42:53,141 INFO [EARDeployer] Init J2EE application: file:/D:/jboss-4.0.3SP1/server/default/deploy/pmt.ear
12:42:53,797 WARN [verifier] EJB spec violation:
Bean : Organization
Method : public void ejbCreate(String, int, int) throws Create Exception, Remote Exception
Section: 9.2.3
Warning: The return type of an ejbCreate (...) method must be the entity bean's primary key type.
What we analyzed was that in ejb-jar.xml there were some entries.
Here in <ejb-class> the Bean class was given, but there was no information about the AccessBean class.
In WSAD the AcessBean classes were generated by the tool, but we actually did not know how to refer the AccessBean.
Can anyone help us in successfully deploying the application to JBOSS server or provide some pointers/ steps to proceed.
Also need help regarding generation of Access Beans, stubs (IBM specific files) in Eclipse 3.2
Thanks
Regards,
dcpmtSo if I understand correctly you wish to use IBM specific classes in support of entity beans running on JBoss?
That won't be necessary on JBoss because JBoss has its own means of supporting entity beans on its server. -
4 specific entity beans or 1 general entity bean?
Hi All,
My question is for example for design a history concept,
I have 4 tables with same size PK and I'm going to design history table, now my question is which way is better to do:
1. create 4 history tables with having FK to original tables , create 4 entity beans
2. create 1 history table without any FK, create just 1 entity bean.
please let me know what's your suggestion?
Thanks so much
MinaGood question minag ! ...
I suggest this model:
If your like flexibility on your system I recommend use Entity EJB 3 inheritance strategy with discriminator value. It implies 5 entity beans mapped on 5 tables.
A. Abstract Entity Bean: History
B. Implementations of History: HistoryTypeA, HistoryTypeB, HistoryTypeC, HistoryTypeD.
Your can get more info on EJB 3 Persistence Specification item 2.1.9. (ejb-3_0-fr-spec-persistence.pdf). -
Weblogic(6.1) deployment descriptor allows configuration of entity bean pool size
and cache size. Since calls from multiple clients to the same entity bean are
serialized what is the benefit of having multiple instances in an entity bean
pool?
Thanks,
StefanAnand,
Of course I don't talk about an extreme case of a table with one row!?, but the
same (logical) entity bean with same primary key accessed by multiple clients.
Each client will use findByPrimaryKey method and will get a reference to same
entity bean mapped to the same "row" in database . My surprise was that even for
this case there are multiple entity instances created in the pool for one row
in the database. For multiple instances mapped to multiple rows we concluded all
makes sense.
thanks again,
Stefan
"Anand Byrappagari" <[email protected]> wrote:
Stefan,
I am not sure I understand your question but if you are asking why
have
pooling, pool of instances is a feature for all types of entity beans.
In
the specific case that you have where the table has only one row it has
limited application but the general case is that you lave multiple rows
in a
table. For example, an Address table will in all probability have hundereds
of addresses of customers. An application accessing this table will be
accessing multiple address instances at any given time. So each of this
instances should be accessable independently hence the pool makes sense
in
this case. I point I am trying to make is that when you define a pool
for a
bean (AddressBean) you are not defining the pool for one instance of
the
bean type(like address_1). The pool specifies the number of instances
(address_1, address_2, ...., address_n) that can exist at any given time.
Are you asking if the pool size is for each row? That is if pool
size is
set to 10, are you asking if you can have atmost 10 instances of address_1
as opposed to 10 instances of any address? The pool and cache sizes refer
to
the limit on any instances and not on 1 instance.
Even in the extreme case like the one you mention where the table
has
only one row, there is some utility in having multiple instances as this
would not require serializing access to the bean - in exclusive strategy,
once a client has locked an EJB instance, other clients are blocked from
the
EJB's data even if they intend only to read the persistent fields. If
you
set the strategy to database then multiple instances can access the data
depending on the isolation levels you have set. Read Chapter 4 of
"Programming Weblogic Enterprise JavaBeans" for more information.
Hope this helps.
-- Anand
"Stefan" <[email protected]> wrote in message
news:[email protected]...
Anand,
If we established that same databse row can be mapped to multiple entitybeans
instances we are back to my original question: Assuming "database"concurrency
strategy, how do you see this model useful if calls from multiple clientsare
serialized across all these instances? I cannot point out the benefitof
the pool
of entity bean instances for same row since they all wait for a clientcall to
finish before replying to another client. Where is the benefit of havingmultiple
instances if one instance would do the same job?
thanks,
Stefan
"Anand Byrappagari" <[email protected]> wrote:
The default concurrency-strategy in weblogic 6.1 is database which
means
that concurrency is taken care of at the database, this model allows
you to
have multiple ejb object instances for the same row in the database.
If you
want a single instance then you can set <concurrency-strategy> element
in
the deployment descriptor for the ejb to Exclusive.
-- Anand
"Stefan" <[email protected]> wrote in message
news:[email protected]...
Thanks Anand,
Sure this way it makes total sense. However I used an example whereI was
referencing
only one row from multiple clients. For this case using the WeblogicConsole I
saw the number of bean instances growing. This would indicate thatsame
row is
mapped to multiple bean instances in the pool, which prompted my
question.
Stefan
"Anand Byrappagari" <[email protected]> wrote:
Think of entity beans as mapping to a row in a database. Access
to
a
single
row is synchronized not to all the rows. So it still makes sense
to
have
multiple instances possibly mapping to multiple rows in the database.
-- Anand
"stefan" <[email protected]> wrote in message
news:[email protected]...
Weblogic(6.1) deployment descriptor allows configuration of entitybean
pool size
and cache size. Since calls from multiple clients to the same
entity
bean
are
serialized what is the benefit of having multiple instances in
an
entity
bean
pool?
Thanks,
Stefan -
Composite Primary Key in M:N CMP Entity Bean Relationship
Dear Sir/Madam,
We are creating an Enterprise Application for our institute using EJB 2.0 specifiactions. In the course of developement, we are facing a problem in writing the CMP Entity Beans with EJB Relationships.
We are having many to many relationship between two beans such that the primary key of one Entity Bean (let's call it A), serves as the foreign key of another Entity Bean (let's call it B). Further, this primary key of A as foreign key in B, participates in the composite key of B.
The EJB Specifications require that the primary key field(s) of any bean (B, in our case) declared in the Primary Key class should be the subset of the 'cmp-field' declared in the deployment descriptor for that bean. As I said earlier, we have many to many relationship at play. Hence, we require to keep the foerign key in the 'cmr-field' in lieu of 'cmp-field'. In short, the component of primary key is in 'cmr-field' while, it is needed in both 'cmp-field' and 'cmr-field'. That's perfect from Database point of view but illogical from CMP Entity Bean's view.
How can we write the deployment descriptor for such a CMP (BMP is working fine for above scenario) Entity Bean? Also, how can we write the Primary Key class? The problem is not just to find the solution, but find under the hood of EJB 2.0 specifications.
Please help.I think you should realise that it would not be convenient to use CMP for everything. It is difficult to define complex relations using CMP. Mostly BMP os preferd since it gives the flexibility for the bean developer.
Regards
xH4x0r -
Bad Performance/OutOfMemory Error in CMP Entity Bean with Large DB
Hello:
I have an CMP Entity deployed on WLS 7.0
The entity bean maps to a table that has 97,480 records.
It has a finder: findAll() -- SELECT OBJECT(e) FROM Equipment e
I have a JSP client that invokes the findALL()
The performance is very poor ~ 150 seconds just to perform the findAll() - (Benchmark
from within the JSP code)
If more than one simultaneous call is made then I get outOfMemory Error.
WLS is started with max memory of 512MB
EJB is deployed with <max-beans-in-cache>100000</max-beans-in-cache>
(without max-beans-in-cache directive the performance is worse)
Is there any documentation available to help us in deploying CMP Entity Beans
with very large number of records (instances) ?
Any help is greatly appreciated.
Regards
RajanHi
You should use a Select Method, it does support cursors.
Or a Home Select Method combination.
Regards
Thomas
WLS is started with max memory of 512MB
EJB is deployed with <max-beans-in-cache>100000</max-beans-in-cache>>
(without max-beans-in-cache directive the performance is worse)>
Is there any documentation available to help us in deploying CMP
Entity Beans with very large number of records (instances) ? Any help
is greatly appreciated.>
Regards>
Rajan>
>
"Rajan Jena" <[email protected]> schrieb im Newsbeitrag
news:3dadd7d1$[email protected]..
>
Hello:
I have an CMP Entity deployed on WLS 7.0
The entity bean maps to a table that has 97,480 records.
It has a finder: findAll() -- SELECT OBJECT(e) FROM Equipment e
I have a JSP client that invokes the findALL()
The performance is very poor ~ 150 seconds just to perform the findAll() -(Benchmark
from within the JSP code)
If more than one simultaneous call is made then I get outOfMemory Error.
WLS is started with max memory of 512MB
EJB is deployed with <max-beans-in-cache>100000</max-beans-in-cache>
(without max-beans-in-cache directive the performance is worse)
Is there any documentation available to help us in deploying CMP EntityBeans
with very large number of records (instances) ?
Any help is greatly appreciated.
Regards
Rajan -
Byte[] Arrays in CMP Entity bean
Hello
One of my fields for a CMP Entity beans is a byte[] Array. When i do a
home.create(primarykey, byteData)
i get an exception saying - "Trying to insert a null in a non-nullable column"
My data is not a null at that point. If i change the byte[] array to a string, it works fine. Does anybody have any suggestions. I am using JBOSS appserver.
thanks
Dashthanks for you reply. i was using cmp with ejb2.0, wherein i do not have to do anything under postcreate(), implementation is handled by the container i guess. But, coming to my problem: I figured out why i got that error. i had a table by the same name with a differnt data type. JBOSS did not report to me saying that the TABLE already exists.
thanks
Maybe you are looking for
-
FM for month and year to Fiscal year period
Hello ABAP Experts, Please suggest a FM to convert month+year to fiscal year period. Suggestions appreciated. Thanks in advance, BWer
-
Happened a few times and now I think it's triggered from working in XP and then rebooting into Vista.Restarting Vista(reboot) doesn't seem to help, but powering down/shutting my PC off and then go into Vista seems to make the problem go away.Changing
-
Promise VTrak e610 Setup Questions
We currently have an 8-core Xserve with a SCSI card going to an HP autoloader for tape backups and a 2 port fibre card in the second slot using 1 port to connect to our old Xserve XRAID enclosure with 4TB of RAID 5 capacity. 3TB of the space is in us
-
Hi, I need to change my old lithium battery 3.6v on my G4. Do you know the size of this battery, and where to buy it on the web? Thank you. berdavid.
-
Lorem and More 1.0.3 with Dreamweaver CS6
Hi and thank you for your help I installed 1.0.3 Lorem More for Dreamweaver, it is activated in ExtensionManager. But, Lorem and More icon is not visible in the tab insertion. Thank you,