#if ($table.package != "")
package ${table.package};
#end

import java.io.Serializable;
import javax.persistence.*;
${table.importStatements}

/**
 * The persistent class for the ${table.name} database table.
 * 
 */
@Entity
#if( !${table.defaultname} || $customizer.generateDDLAnnotations)
@Table(name="${table.name}")
#end
public class ${table.className} ${table.generateExtendsImplements()} {
	private static final long serialVersionUID = 1L;
#####
##### fields
#####
#if ($table.compositeKey)
#if ($table.access == "field")

	@EmbeddedId
#end
	private ${table.compositeKeyClassName} ${table.compositeKeyPropertyName};
#end
#foreach ($column in $table.getSimpleColumns(true, true, false))
#if ($table.access == "field")

#parse("mappingKind.vm")
#parse("column.vm")
#end
	${column.fieldScope} ${column.simplePropertyType} ${column.propertyName};
#end
#foreach ($role in $table.associationRoles)
#####
##### field annotations
#####
#if ($table.access == "field")

	//${role.description}
#if ($role.cardinality == "many-to-one")
#parse("manyToOne.vm")
#elseif ($role.cardinality == "many-to-many")
#parse("manyToMany.vm")
#elseif ($role.cardinality == "one-to-many")
#parse("oneToMany.vm")
#elseif ($role.cardinality == "one-to-one")
#parse("oneToOne.vm")
#end
#end
#####
##### field declaration
#####
#if ($role.cardinality == "many-to-one" || $role.cardinality == "one-to-one")
#set ($propertyType = ${role.referencedTable.className})
#elseif ($role.cardinality == "many-to-many" || $role.cardinality == "one-to-many")
#set ($propertyType = "${role.referencedTable.simpleCollectionType}<${role.referencedTable.className}>")
#end
	private $propertyType $role.propertyName;
#end

    public ${table.className}() {
    }

#####
##### simple properties getters and setters
#####
#if ($table.compositeKey)
#if ($table.access == "property")

	@EmbeddedId
#end
	public $table.compositeKeyClassName $customizer.propertyGetter($table.compositeKeyPropertyName)() {
		return this.${table.compositeKeyPropertyName};
	}

	public void $customizer.propertySetter($table.compositeKeyPropertyName)($table.compositeKeyClassName $table.compositeKeyPropertyName) {
		this.${table.compositeKeyPropertyName} = ${table.compositeKeyPropertyName};
	}
	
#end
#foreach ($column in $table.getSimpleColumns(true, true, false))
#if ($table.access == "property")

#parse("mappingKind.vm")
#parse("column.vm")
#end
	$column.propertyGetScope $column.simplePropertyType $customizer.propertyGetter($column.propertyName)() {
		return this.${column.propertyName};
	}

	$column.propertySetScope void $customizer.propertySetter($column.propertyName)($column.simplePropertyType $column.propertyName) {
		this.${column.propertyName} = ${column.propertyName};
	}

#end
#####
##### associations getters and setters
#####
#foreach ($role in $table.associationRoles)
#if ($table.access == "property")

	//${role.description}
#if ($role.cardinality == "many-to-one")
#parse("manyToOne.vm")
#elseif ($role.cardinality == "many-to-many")
#parse("manyToMany.vm")
#elseif ($role.cardinality == "one-to-many")
#parse("oneToMany.vm")
#elseif ($role.cardinality == "one-to-one")
#parse("oneToOne.vm")
#end
#end
##
#if ($role.cardinality == "many-to-one" || $role.cardinality == "one-to-one")
#set ($propertyType = $role.referencedTable.className)
#elseif ($role.cardinality == "many-to-many" || $role.cardinality == "one-to-many")
#set ($propertyType = "${role.referencedTable.simpleCollectionType}<${role.referencedTable.className}>")
#end
	public $propertyType $customizer.propertyGetter($role.propertyName)() {
		return this.${role.propertyName};
	}

	public void ${customizer.propertySetter($role.propertyName)}($propertyType $role.propertyName) {
		this.${role.propertyName} = $role.propertyName;
	}
	
##
#end
##
}