#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=$customizer.convertToJavaStringLiteral(${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
##
}