<%@ jet package="compiledtemplates"
imports="java.util.* util.DatabaseGenerationHelper org.eclipse.emf.ecore.* org.eclipse.emf.codegen.util.*"
class="Hibernate" %>
<%
%>
<%EPackage ePackage = (EPackage) argument;
DatabaseGenerationHelper h = new DatabaseGenerationHelper();
%>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="<%=h.getQualifiedName(ePackage)%>" >
<%for (EClass eClass : h.getClasses(ePackage)) {
EAttribute idAttribute = h.getIdAttribute(eClass);
// skip repository classes
if (eClass.getName().endsWith("Repository")) {continue;}
// skip subclasses, they are handled as joined-subclass
if (!h.getExtends(eClass).isEmpty()) {continue;}
%>
<class name="<%=h.getQualifiedName(eClass)%>"
table="<%=h.getDatabaseName(eClass)%>">
<id name="<%=h.getName(idAttribute)%>" >
<generator class="native" />
</id>
<%if (!h.getSubClasses(eClass).isEmpty()) {%>
<discriminator column="<%=h.getDatabaseName(eClass)%>_TYPE" type="string" />
<%}%>
<%if (h.getNaturalKeys(eClass).isEmpty()) {%>
<property name="UUIDString" />
<%}%>
<%for (EAttribute attribute : h.getAttributes(eClass)) {%>
<%if (attribute == idAttribute) {continue;} %>
<property name="<%=h.getName(attribute)%>" />
<%}%>
<%for (EReference ref : h.getAllOneReferences(eClass)) {%>
<many-to-one name="<%=h.getName(ref)%>" column="<%=h.getForeignKeyName(ref)%>"
class="<%=h.getQualifiedName(ref.getEReferenceType())%>" />
<%}%>
<%for (EReference ref : h.getManyToOneReferences(eClass)) {%>
<<%=h.getCollectionType(ref)%> name="<%=h.getName(ref)%>"
lazy="<%=h.getAnnotation(ref, "lazy", "false")%>"
inverse="true"
<%if ("bag".equals(h.getCollectionType(ref))) {%>
order-by="<%=h.getAnnotation(ref, "orderBy", "ID")%>"
<%}%>
cascade="<%=h.getAnnotation(ref, "cascade", "all")%>">
<!-- use cascade="cascade-delete-orphan" to delete children when parent is deleted -->
<key column="<%=h.getForeignKeyName(eClass)%>" />
<%if ("list".equals(h.getCollectionType(ref))) {%>
<index column="<%=h.getDatabaseName(ref)%>_INDEX" />
<%}%>
<one-to-many class="<%=h.getQualifiedName(ref.getEReferenceType())%>" />
</<%=h.getCollectionType(ref).toLowerCase()%>>
<%}%>
<%for (EReference ref : h.getManyToManyReferences(eClass)) {%>
<set name="<%=h.getName(ref)%>"
<%if (h.isInverse(ref)) {%>
inverse="true"
<%}%>
table="<%=h.getManyToManyJoinTableName(ref)%>"
lazy="<%=h.getAnnotation(ref, "lazy", "false")%>"
cascade="<%=h.getAnnotation(ref, "cascade", "all")%>">
<key column="<%=h.getForeignKeyName(eClass)%>" />
<many-to-many
column="<%=h.getForeignKeyName(ref.getEReferenceType())%>"
class="<%=h.getQualifiedName(ref.getEReferenceType())%>" />
</set>
<%}%>
<%for (EClass subClass : h.getSubClasses(eClass)) {%>
<joined-subclass name="<%=h.getQualifiedName(subClass)%>"
table="<%=h.getDatabaseName(subClass)%>">
<key column="<%=h.getForeignKeyName(eClass)%>" />
<%for (EAttribute attribute : h.getAttributes(subClass)) {%>
<property name="<%=h.getName(attribute)%>" />
<%}%>
<%// TODO associations also, maybe extract above into jetinc %>
</joined-subclass>
<%}%>
</class>
<%}%>
</hibernate-mapping>