<%@ jet package="com.ibm.wtp.ejb" 
	imports="com.ibm.etools.j2ee.ejb.creation.operations.* java.util.* com.ibm.etools.ejb.creation.*" 
	class="CMP2xEntityBeanTemplate" 
%><%@ include file="cmpHeader.template" %> 

public abstract class <%=model.getSimpleBeanClassName()%> <% if (model.getQualifiedSuperBeanClassName() != "") { %>extends <%=model.getQualifiedSuperBeanClassName()%> <% } %>implements EntityBean {
<%@ include file="basicEntityMembers.template" 
%><%  
    /* Used in multiple locations for iterating fields */
	Iterator fields = null;
 	CMPField field = null;
 	boolean isFirst;
%>	
 	/**
	 * ejbCreate
	 * @ejb.create-method
	 *  view-type="<%= model.getRemoteHome() == null ? "remote" : "local" %>"
	 */
	public <%=model.getKeyClassName()%> ejbCreate(<%@ include file="keyFieldList.template" %>) throws CreateException {
<%   	fields = model.getCMPFields().iterator();
     	while (fields.hasNext()) {
     		field = (CMPField)fields.next(); 
     		if (field.isIsKey()) {
     			String sfx = field.methodSuffix();%>
     	set<%=sfx%>(<%=field.getName()%>);
<% } 
}%>
		return null;
	}
	/**
	 * ejbPostCreate
	 */
	public void ejbPostCreate(<%@ include file="keyFieldList.template" %>) throws CreateException {
	}
	
<%   	fields = model.getCMPFields().iterator();
     	while (fields.hasNext()) {
     		field = (CMPField)fields.next(); 
     		String sfx = field.methodSuffix();
%>     		
    /**
	 * Get accessor for persistent attribute: <%= field.getName() %>
	 * @ejb.persistence 
	 *  read-only="<%=field.isGetterRO()%>"<%@ include file="interfaceMethod.template" %><%
	 if (!model.usesPrimitiveKey() && field.isIsKey()) {%> 
	 * @ejb.pk-field<%}%>
	 */
    public abstract <%= field.getTypeSignature() %> get<%=sfx%>();
    
    /**
	 * Set accessor for persistent attribute: <%= field.getName() %>
	 * @ejb.persistence <%@ include file="interfaceMethod.template" %>
	 */
    public abstract void set<%=sfx%>(<%=field.getTypeSignature()%> new<%=sfx%>);

<%	 } %>
}