using xdoclet to have cmp auto-generate primary key values

[email protected]
Newsgroups gmane.comp.java.ejb.middlegen.user
Message-ID <[email protected]>

This may seem like an odd request, but here goes...

I'm using JBoss 3.2.3 with PostgreSQL 7.3.2, and I have a CMP entity bean (coded using ejbdoclet) that has an integer primary key. The ejbCreate code currently generates the value for the primary key by doing a "select max(id) from table", which is really slow because it has to access the database twice (the select and the insert). 

I understand that it's possible to have the entity bean use the database to auto-generate new primary key values. (With postgres, it has been recommended to use a database sequence to generate the values.)

Supposedly it's possible to do this in ejbdoclet, but I can't find any reasonable documentation or an example to copy.  I then discovered that Middlegen can generate the ejbdoclet file for me.  I downloaded Middlegen and have been unsuccessful in getting it working in my environment.

But my ultimate goal isn't to get Middlegen running.  All I want is an example ejbdoclet file for a CMP entity bean that has its primary key value auto-generated by a PostgreSQL sequence.

Following is the source code for the entity bean.  Could someone show me how to change it so that the primary key value is auto-generated by a PostgreSQL sequence?  Or, could someone email me an xdoclet file of some other CMP entity bean that uses a PostgreSQL sequence to generate the primary key value?


Thanks,
Mike 


--------- ejbdoclet file follows --------- 



import javax.ejb.*;
import java.sql.*;


/**
 * @ejb.bean name="Item"
 * jndi-name="Item"
 * local-jndi-name="ItemLocal"
 * type="CMP" cmp-version="2.x"
 * view-type="both"
 * 
 * @ejb.home remote-class="com.blah.ejb.entity.item.ItemHome"
 *           local-class="com.blah.ejb.entity.item.ItemLocalHome"
 * 
 * 
 * @ejb.interface remote-class="com.blah.ejb.entity.item.Item"
 *                local-class="com.blah.ejb.entity.item.ItemLocal"
 * 
 * @ejb.persistence table-name="Item"
 * 
 * @jboss.persistence create-table="false" remove-table="false"
 * 
 * @ejb.transaction type="Required"
 * 
 * @ejb.pk class="com.blah.ejb.entity.item.ItemPK"
 * 
 */

public abstract class ItemEJB implements EntityBean {

	protected EntityContext entityContext = null;


	///////////////////////////////////////////////////////
	// Container Managed Persistent Fields
	///////////////////////////////////////////////////////

	/**
	 * @ejb.interface-method view-type="both"
	 * @ejb.persistence column-name="itemID" 
	 * @ejb:pk-field
	 */
	public abstract int getItemID();
	
	/**
	 * @ejb.interface-method view-type="both"
	 * @ejb.persistence column-name="itemID" 
	 */
	public abstract void setItemID(int itemID);


	/**
	 * @ejb.interface-method view-type="both"
	 * @ejb.persistence column-name="name" 
	 */
	public abstract String getName();
	
	/**
	 * @ejb.interface-method view-type="both"
	 * @ejb.persistence column-name="name" 
	 */
	public abstract void setName(String name);


	///////////////////////////////////////////////////////
	// Create methods
	///////////////////////////////////////////////////////

	/**
	 * @ejb.create-method view-type="both"
	 */
	public ItemPK ejbCreate(String name) throws CreateException {
		synchronized(Item.class) {
			int itemID = 0;

			Connection con = null;
			PreparedStatement ps = null;
			try {
				con = JNDICache.getConnection();
				ps = con.prepareStatement("select MAX(ItemID) from ITEM");
				ResultSet rs = ps.executeQuery();
				rs.next(); 
				itemID = rs.getInt(1) + 1;
				rs.close();
			}
			catch (SQLException se) {
			}
			finally {
				ps.close(); on.close();
			}

			setItemID(itemID);
			setName(name);

			return new ItemPK(itemID);
		}
	}
	
	public void ejbPostCreate(String name) {
	}


	///////////////////////////////////////////////////////
	// Other required methods
	///////////////////////////////////////////////////////

	public void setEntityContext(EntityContext ec) {
		entityContext = ec;
	}

	public void unsetEntityContext() {
		entityContext = null;
	}

	public void ejbActivate() { }
	public void ejbPassivate() { }
	public void ejbLoad() { }
	public void ejbStore() { }
	public void ejbRemove() { }
}



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.