Re: [OpenEJB-user] Just a simple question...
Brought to you by:
dblevins,
monson-haefel
From: Paulo L. <pm...@ne...> - 2003-09-26 09:56:27
|
Jeremy Whitlock wrote: >Paulo, > I'd be all for helping you with the Bean Generator as that idea >is a good one. Let me know, Jeremy > >-----Original Message----- >From: David Blevins [mailto:dav...@vi...] >Sent: Thursday, September 25, 2003 2:07 PM >To: Jeremy Whitlock >Cc: 'Paulo Lopes'; OpenEJB >Subject: Re: [OpenEJB-user] Just a simple question... > >... > >Hey Paulo, you are thinking to write a ejb generator...ever think of >killing two birds with one stone? CMP 2.0 is all about generating >beans. > > Well the generator, if you want to call it that, is in a very, very, very early stage :-) I send it in attach (souce only to avoid virus). You can try it, but right now it only dump's some text to stdout. If you want to give it a try, you need to change the INPUT file location in the main class because it's hardcoded (shame on me :-). The code has almost no comments, i know that it isn't a very nice way to code, but this it the first prototype. Here is how it works: First generate the INPUT file. Well this is the first approach, later it can be some standard format. The sample that i'm working is like this: EJB:UTILIZADOR:user:com.netvita.xsite field:int:UTIL_ID:id:not null:ro:pk field:string:UTIL_NOME:name:null what does this crap mean? :-) simple, every time there's a line with EJB it means that a new Entity Bean is to be created with the fields in the next lines. The parameters are like this: EJB:<DBMS physical table name>:<EJB Bean name for that entity>:<base package name> field:<type of that field>:<physyical table field name from DBMS>:<Bean property name>:<is the table field nullable?>:<can the remote interface change it's content?>:<is primary key?> the last two options of the field line are optional. I know that this format is a mess... The output for that file would be: <!-- web.xml part --> <ejb-ref> <description>EJB reference to bean user</description> <ejb-ref-name>ejb/user</ejb-ref-name> <ejb-ref-type>Entity</ejb-ref-type> <home>com.netvita.xsite.UserHome</home> <remote>com.netvita.xsite.UserRemote</remote> </ejb-ref> <!-- server.xml part --> <Ejb name="ejb/user" type="Entity" home="com.netvita.xsite.UserHome" remote="com.netvita.xsite.UserRemote" /> <ResourceParams name="ejb/user"> <parameter> <name>factory</name> <value>org.openejb.client.TomcatEjbFactory</value> </parameter> <parameter> <name>openejb.naming.factory.initial</name> <value>org.openejb.client.LocalInitialContextFactory</value> </parameter> <parameter> <name>openejb.ejb-link</name> <value>User</value> </parameter> </ResourceParams> <!-- ejb-jar.xml part --> <?xml version="1.0"?> <ejb-jar> <description>Auto Generated EJB Descriptor, please Validate</description> <enterprise-beans> <entity> <ejb-name>User</ejb-name> <home>com.netvita.xsite.UserHome</home> <remote>com.netvita.xsite.UserRemote</remote> <ejb-class>com.netvita.xsite.UserBean</ejb-class> <persistence-type>Bean</persistence-type> <prim-key-class>java.lang.Integer</prim-key-class> <reentrant>False</reentrant> <resource-ref> <res-ref-name>jdbc/xsite</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </entity> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>User</ejb-name> <method-name>*</method-name> </method> <trans-attribute>NotSupported</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> // value object implementation... public class UserDO implement java.io.Serializable { private Integer id = null; private String name = null; // optimize the ejbStore() private dirty = false; protected void setId(Integer integer) throws MandatoryFieldException { // since the db field can't be null we won't allow you to set it null... if(integer == null) throw new MandatoryFieldException("integer can't be null."); // both internal and new fields are equal, leave it as it is... if(integer.equals(this.id)) return; this.id = integer; this.dirty = true; } public void setName(String string) { // both internal and new fields are null, leave it as it is... if(string == null && this.name == null) return; // both internal and new fields are equal, leave it as it is... if(string != null && string.equals(this.name)) return; this.name = string; this.dirty = true; } public Integer getId() { return this.id; } public String getName() { return this.name; } } // home interface import java.util.Collection; import javax.ejb.*; public interface UserHome extends EJBHome { public UserRemote create(UserDO user) throws CreateException, RemoteException; public UserRemote findByPrimaryKey(UserDO user) throws FinderException, RemoteException; public Collection find(UserDO user) throws FinderException, RemoteException; } // TODO: // Remote Interface + EJB bean That's it for now... Why am i making the Value Objects layer you may ask, since we've been discussing that is the list. Well... i've made a test bean (entity with BMP) and if i have a bean with for example 2 properties, and i call: remoteInterface.setProp1(x); remoteInterface.setProp2(y); on the remote interface of that bean i also get the ejbStore() to be called twice, i think that this is correct, since the need to make sure that the object is persistent, but if i want to update a few fields at a time on some bean, this will make lot's of SQL insert's rather than than just one. If i have a value object and a method like set(ValueObject o) that sets all properties in one time. I don't know how it behaves with CMP, because the only DBMS i've used with ejb's is MSSQL and some tables that needed some weird queries to fetch data so it was easy to make it in BMP. Have fun :-) Paulo. |