You are viewing a plain text version of this content. The canonical link for it is here.
Posted to torque-dev@db.apache.org by to...@db.apache.org on 2004/07/02 12:51:51 UTC

[DB Torque Wiki] Updated: HarderTorqueFaq

   Date: 2004-07-02T03:51:51
   Editor: RaphaelMankin <ra...@mankin.org.uk>
   Wiki: DB Torque Wiki
   Page: HarderTorqueFaq
   URL: http://wiki.apache.org/db-torque/HarderTorqueFaq

   Serialising OM objects with XMLEncoder/XMLDecoder

Change Log:

------------------------------------------------------------------------------
@@ -37,6 +37,131 @@
 
 ---
 Yes, you can have a multi-column primary-key, BUT it does not work, if you need one column of this PK as autoincrement. And this is my problem. The Torque engine looks up the new key from the sequence and writes it into the System.out/Log-File, but it does not put it into the PK-field, where I need the value.
-Would be nice, if someone had a solution for this. I found the same problem in another forum, but there was also no answer to this question. 
+Would be nice, if someone had a solution for this. I found the same problem in another forum, but there was also no answer to this question.
 
 SyncMaster
+
+
+== Using XMLEncoder/XMLDecoder with Torque ==
+
+java.beans.{XMLEncoder,XMLDecoder} is a useful and fairly simple way of transferring Torque objects to non-Java clients. The encoder uses introspection and will correctly handle any network of objects that conform to the Java beans conventions. Unfortunately, Torque's OM classes do not quite conform.
+
+1. If you declare a field as DATE or TIMESTAMP the OM field will be of class java.util.Date but when you retrieve the object from the database the returned field will be of type java.sql.Date or java.sql.Timestamp. Since none of these classes is a valid Java bean the encoder's introspection fails, though it does have special rules for dealing with java.util.Date.
+
+2. When you have a foreign key Torque generates get and set methods for both the key and the object referrred to. The introspector does not realise that these are linked fields and so fetches the underlying object for each foreign key.
+
+The solutions are
+
+1. If you have a field declaration of the form
+
+{{{   <field name="entrydate"
+		   type="DATE"
+	      />
+}}}
+
+you have to over-ride the getEntrydate() method in the OM class with
+
+{{{
+	public java.util.Date getEntrydate()
+	{
+		java.util.Date	d	= super.getEntrydate();
+		return (d instance of java.util.Date) ? d :
+			new java.util.Date(d.getTime());
+	}
+}}}
+
+2. To prevent the fetching of underlying objects referred to by foreign keys create a BeanInfo class for each OM class that has foreign keys.
+
+Suppose that you have the following table declaration, which contains a foreign key.
+
+{{{
+    <table name="MODELEVENT"
+    >
+	<column
+	    name="MODELEVENTID"
+	    type="INTEGER"
+	    required="true"
+	    primaryKey="true"
+	    autoIncrement="true"
+	/>
+	<column
+	    name="MODELVERSIONID"
+	    type="INTEGER"
+	    required="true"
+	/>
+	<column
+	    name="EVENT"
+	    type="VARCHAR"
+	    size="50"
+	    required="true"
+	/>
+	<column
+	    name="COMMENTS"
+	    type="VARCHAR"
+	    size="256"
+	    required="false"
+	/>
+	<column
+	    name="ENTRYDATE"
+	    type="TIMESTAMP"
+	    required="true"
+	/>
+	<column
+	    name="PERSON"
+	    type="VARCHAR"
+	    size="50"
+	    required="true"
+	/>
+       <foreign-key foreignTable="MODELVERSION">
+	   <reference local="MODELVERSIONID" foreign="MODELVERSIONID"/>
+	</foreign-key>
+    </table>
+}}}
+
+You then need to have this BeanInfo class
+
+{{{
+
+package com.gsk.pmf;
+
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
+import java.beans.SimpleBeanInfo;
+
+/**
+ * @version $Id;$
+ */
+public class ModeleventBeanInfo extends SimpleBeanInfo {
+	Class	meClass	= Modelevent.class;
+    /**
+     *
+     */
+    public ModeleventBeanInfo() {
+        super();
+     }
+	public PropertyDescriptor[] getPropertyDescriptors()
+	{
+		try {
+			PropertyDescriptor modelversionid = new PropertyDescriptor("modelversionid", meClass);
+			PropertyDescriptor modeleventid = new PropertyDescriptor("modeleventid", meClass);
+			PropertyDescriptor comments = new PropertyDescriptor("comments", meClass);
+			PropertyDescriptor entrydate = new PropertyDescriptor("entrydate", meClass);
+			PropertyDescriptor person = new PropertyDescriptor("person", meClass);
+			PropertyDescriptor event = new PropertyDescriptor("event", meClass);
+			PropertyDescriptor[] rv = {
+					comments, entrydate, person, modeleventid,
+					event, modelversionid
+			};
+			return rv;
+		} catch (IntrospectionException e) {
+			System.err.println("IntrospectionException"+e.getMessage());
+			e.printStackTrace();
+		}
+		return null;
+	}
+}
+
+
+}}}
+
+This BeanInfo includes the ''modelversionid'' but excludes the ''modelversion'' that it refers to. The encoder will therefore include the ID field but omit the target object. It will also omit all the housekeeping fields such as ''new'' and ''modified''.

---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org