#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;
    }
}