388568 - add/remove methods for one to many bidi relationships.
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.gen/src/org/eclipse/jpt/jpa/gen/internal/ORMGenCustomizer.java b/jpa/plugins/org.eclipse.jpt.jpa.gen/src/org/eclipse/jpt/jpa/gen/internal/ORMGenCustomizer.java
index b053bf5..dbd7358 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.gen/src/org/eclipse/jpt/jpa/gen/internal/ORMGenCustomizer.java
+++ b/jpa/plugins/org.eclipse.jpt.jpa.gen/src/org/eclipse/jpt/jpa/gen/internal/ORMGenCustomizer.java
@@ -546,6 +546,20 @@
 	public String propertySetter(String propertyName) {
 		return "set"+StringUtil.initUpper(propertyName);
 	}
+	/**
+	 * Returns a add method name given a property name.
+	 */
+	public String propertyAdd(String propertyName) {
+		String name = StringUtil.singularise(propertyName);
+		return "add"+StringUtil.initUpper(name);
+	}
+	/**
+	 * Returns a remove method name given a property name.
+	 */
+	public String propertyRemove(String propertyName) {
+		String name = StringUtil.singularise(propertyName);
+		return "remove"+StringUtil.initUpper(name);
+	}
 	public String quote(String s) {
 		return StringUtil.quote(s, '"');
 	}
@@ -561,6 +575,9 @@
 	public String convertToXmlStringLiteral(String s) {
 		return StringTools.convertToXmlAttributeValue(s);
 	}
+	public String convertToSingularisedString(String s) {
+		return StringUtil.singularise(s);
+	}
 	/**
 	 * Appends an annotation member name and value to an existing annotation.
 	 * 
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.gen/templates/entities/main.java.vm b/jpa/plugins/org.eclipse.jpt.jpa.gen/templates/entities/main.java.vm
index 31306f4..dc59acb 100644
--- a/jpa/plugins/org.eclipse.jpt.jpa.gen/templates/entities/main.java.vm
+++ b/jpa/plugins/org.eclipse.jpt.jpa.gen/templates/entities/main.java.vm
@@ -128,6 +128,11 @@
 		this.${role.propertyName} = $role.propertyName;

 	}

 

+#if ($role.cardinality == "one-to-many" && $role.association.bidirectional)

+#parse("oneToManyMethods.vm")

+

+

+#end

 ##

 #end

 ##

diff --git a/jpa/plugins/org.eclipse.jpt.jpa.gen/templates/entities/oneToManyMethods.vm b/jpa/plugins/org.eclipse.jpt.jpa.gen/templates/entities/oneToManyMethods.vm
new file mode 100644
index 0000000..c0ba039
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.jpa.gen/templates/entities/oneToManyMethods.vm
@@ -0,0 +1,16 @@
+##included template. Generates the @OneToMany methods.

+##Assumes that the context has a "role" object representing the generated AssociationRole

+##

+	public $role.referencedTable.className $customizer.propertyAdd($role.propertyName)($role.referencedTable.className $customizer.convertToSingularisedString($role.propertyName)) {

+		$customizer.propertyGetter($role.propertyName)().add($customizer.convertToSingularisedString($role.propertyName));

+		$customizer.convertToSingularisedString($role.propertyName).$customizer.propertySetter($role.oppositeRole.propertyName)(this);

+

+		return $customizer.convertToSingularisedString($role.propertyName);

+	}

+

+	public $role.referencedTable.className $customizer.propertyRemove($role.propertyName)($role.referencedTable.className $customizer.convertToSingularisedString($role.propertyName)) {

+		$customizer.propertyGetter($role.propertyName)().remove($customizer.convertToSingularisedString($role.propertyName));

+		$customizer.convertToSingularisedString($role.propertyName).$customizer.propertySetter($role.oppositeRole.propertyName)(null);

+

+		return $customizer.convertToSingularisedString($role.propertyName);

+	}
\ No newline at end of file