#if ($table.package != "")
package ${table.package};
#end

import java.io.Serializable;
import javax.persistence.*;

/**
 * The primary key class for the ${table.name} database table.
 * 
 */
@Embeddable
public class ${table.compositeKeyClassName} implements Serializable {
	//default serial version id, required for serializable classes.
	private static final long serialVersionUID = 1L;
#####
##### fields
#####
#foreach ($column in $table.primaryKeyColumns)
#if ($table.access == "field")

#parse("column.vm")
#end
	${column.fieldScope} ${column.propertyType} ${column.propertyName};
#end

    public ${table.compositeKeyClassName}() {
    }
#####
##### simple properties getters and setters
#####
#foreach ($column in $table.primaryKeyColumns)
#if ($table.access == "property")

#parse("column.vm")
#end
	$column.propertyGetScope $column.propertyType $customizer.propertyGetter($column.propertyName)() {
		return this.${column.propertyName};
	}
	$column.propertySetScope void $customizer.propertySetter($column.propertyName)($column.propertyType $column.propertyName) {
		this.${column.propertyName} = ${column.propertyName};
	}
#end
##
## equals/hashCode

	public boolean equals(Object other) {
		if (this == other) {
			return true;
		}
		if (!(other instanceof ${table.compositeKeyClassName})) {
			return false;
		}
		${table.compositeKeyClassName} castOther = (${table.compositeKeyClassName})other;
		return 
			${table.primaryKeyEqualsClause}

    }
    
	public int hashCode() {
		final int prime = 31;
		int hash = 17;
		${table.primaryKeyHashCodeClause}
		return hash;
    }
}