db-torque-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From torque-...@db.apache.org
Subject [DB Torque Wiki] Updated: HarderTorqueFaq
Date Fri, 02 Jul 2004 10:51:51 GMT
   Date: 2004-07-02T03:51:51
   Editor: RaphaelMankin <raph@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


Mime
View raw message