Author: arminw
Date: Thu Jan 4 19:12:42 2007
New Revision: 492886
URL: http://svn.apache.org/viewvc?view=rev&rev=492886
Log:
add new test
Added:
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/OneToOneWithoutFKTest.java
Added:
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/OneToOneWithoutFKTest.java
URL:
http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/OneToOneWithoutFKTest.java?view=auto&rev=492886
==============================================================================
---
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/OneToOneWithoutFKTest.java
(added)
+++
db/ojb/branches/OJB_1_0_RELEASE/src/test/org/apache/ojb/broker/OneToOneWithoutFKTest.java
Thu Jan 4 19:12:42 2007
@@ -0,0 +1,354 @@
+package org.apache.ojb.broker;
+
+/* Copyright 2002-2006 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.Serializable;
+
+import org.apache.ojb.junit.PBTestCase;
+import org.apache.ojb.broker.metadata.ObjectReferenceDescriptor;
+import org.apache.ojb.broker.util.ObjectModification;
+
+/**
+ * This class show handling of bidirectional 1:1 reference without
+ * using a separate FK column (the PK of the main object is the FK too and the
both objects use
+ * the same PK value).
+ * NOTE: It's not recommended to use 1:1 references without FK column.
+ *
+ * @version $Id: $
+ */
+public class OneToOneWithoutFKTest extends PBTestCase
+{
+ public static void main(String[] args)
+ {
+ String[] arr = {OneToOneWithoutFKTest.class.getName()};
+ junit.textui.TestRunner.main(arr);
+ }
+
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ }
+
+ public void tearDown() throws Exception
+ {
+ super.tearDown();
+ }
+
+ /**
+ * Handle Person object without using a reference to Passport class.
+ */
+ public void testInsertUpdateDeletePerson()
+ {
+ ojbChangeReferenceSetting(Passport.class, "person",
+ true, ObjectReferenceDescriptor.CASCADE_NONE,
ObjectReferenceDescriptor.CASCADE_NONE, true);
+ ojbChangeReferenceSetting(Person.class, "passport",
+ true, ObjectReferenceDescriptor.CASCADE_OBJECT,
ObjectReferenceDescriptor.CASCADE_OBJECT, true);
+ String t = "_" + System.currentTimeMillis();
+ String name = "Person_testInsertUpdateDeletePerson_" + t;
+
assertTrue(broker.getClassDescriptor(Person.class).getObjectReferenceDescriptorByName("passport").isLazy());
+
assertTrue(broker.getClassDescriptor(Passport.class).getObjectReferenceDescriptorByName("person").isLazy());
+
+
+ Person pers = new Person(name);
+
+ broker.beginTransaction();
+ // store plain Person
+ broker.store(pers, ObjectModification.INSERT);
+ broker.commitTransaction();
+ // clear cache to check DB entry
+ broker.clearCache();
+ // lookup
+ Identity oid = broker.serviceIdentity().buildIdentity(Person.class,
pers.getId());
+ Person pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNotNull(pers_new);
+
+ broker.beginTransaction();
+ pers_new.setName(name + "_updated");
+ // store plain Person
+ broker.store(pers_new, ObjectModification.UPDATE);
+ broker.commitTransaction();
+ // clear cache to check DB entry
+ broker.clearCache();
+ // lookup
+ oid = broker.serviceIdentity().buildIdentity(Person.class,
pers_new.getId());
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNotNull(pers_new);
+ assertEquals(name+"_updated", pers_new.getName());
+ // NOTE: You try to access the none existing Passport object
+ // always null will be returned
+ assertNull(pers_new.getPassport().getId());
+ assertNull(pers_new.getPassport().getNumber());
+ assertNull(pers_new.getPassport().getPerson());
+
+
+ broker.beginTransaction();
+ // delete plain Person
+ broker.delete(pers);
+ broker.commitTransaction();
+ // lookup
+ oid = broker.serviceIdentity().buildIdentity(Person.class,
pers_new.getId());
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNull(pers_new);
+ }
+
+ /**
+ * Handle Person <---> Passport objects with enabled proxy
+ */
+ public void testInsertUpdateDelete()
+ {
+ // metadata settings
+ // the main object Person use cascade update/delete, the dependend
object not.
+ // For both 1:1 references proxy object are enabled.
+ ojbChangeReferenceSetting(Passport.class, "person",
+ true, ObjectReferenceDescriptor.CASCADE_NONE,
ObjectReferenceDescriptor.CASCADE_NONE, true);
+ ojbChangeReferenceSetting(Person.class, "passport",
+ true, ObjectReferenceDescriptor.CASCADE_OBJECT,
ObjectReferenceDescriptor.CASCADE_OBJECT, true);
+ String t = "_" + System.currentTimeMillis();
+ String name = "Person_testInsertUpdateDelete_" + t;
+ String number = "Passport_testInsertUpdateDelete_" + t;
+
assertTrue(broker.getClassDescriptor(Person.class).getObjectReferenceDescriptorByName("passport").isLazy());
+
assertTrue(broker.getClassDescriptor(Passport.class).getObjectReferenceDescriptorByName("person").isLazy());
+
+ // insert
+ Person pers = new Person(name);
+ Passport pass = new Passport(number);
+ broker.beginTransaction();
+ // store plain Person to assign PK
+ broker.store(pers);
+ // set PK/FK of Passport
+ pass.setId(pers.getId());
+ // set references
+ pers.setPassport(pass);
+ pass.setPerson(pers);
+ broker.store(pers);
+ broker.commitTransaction();
+
+ // lookup
+ Identity oid = broker.serviceIdentity().buildIdentity(pers);
+ Person pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNotNull(pers_new);
+ assertNotNull(pers_new.getPassport());
+
+ // update
+ broker.beginTransaction();
+ pers_new.setName(name + "_updated");
+ pers_new.getPassport().setNumber(number + "_updated");
+ broker.store(pers_new);
+ broker.commitTransaction();
+
+ // lookup
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNotNull(pers_new);
+ assertNotNull(pers_new.getPassport());
+ assertEquals(name + "_updated", pers_new.getName());
+ assertEquals(number + "_updated", pers_new.getPassport().getNumber());
+
+ // update nullify reference, with proxy references enabled, this result
+ // in unexpected proxy placeholder intead of null reference
+ broker.beginTransaction();
+ broker.delete(pers_new.getPassport());
+ pers_new.setPassport(null);
+ broker.store(pers_new);
+ broker.commitTransaction();
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNotNull(pers_new);
+ // we alway get a proxy placeholder object
+ // assertNull(pers_new.getPassport());
+ assertNull(pers_new.getPassport().getId());
+ assertEquals(name + "_updated", pers_new.getName());
+
+ // delete
+ broker.beginTransaction();
+ // first delete the object with constraint
+ broker.delete(pers_new.getPassport());
+ // not needed, but this reduce the number of generated queries
+ pers_new.setPassport(null);
+ broker.delete(pers_new);
+ broker.commitTransaction();
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNull(pers_new);
+ }
+
+ /**
+ * Handle Person <---> Passport objects withot proxy
+ */
+ public void testInsertUpdateDelete_2()
+ {
+ // metadata settings
+ // the main object Person use cascade update/delete, the dependend
object not.
+ // For both 1:1 references proxy references are disabled.
+ ojbChangeReferenceSetting(Passport.class, "person",
+ true, ObjectReferenceDescriptor.CASCADE_NONE,
ObjectReferenceDescriptor.CASCADE_NONE, false);
+ ojbChangeReferenceSetting(Person.class, "passport",
+ true, ObjectReferenceDescriptor.CASCADE_OBJECT,
ObjectReferenceDescriptor.CASCADE_OBJECT, false);
+ String t = "_" + System.currentTimeMillis();
+ String name = "Person_testInsertUpdateDelete_2_" + t;
+ String number = "Passport_testInsertUpdateDelete_2_" + t;
+
assertFalse(broker.getClassDescriptor(Person.class).getObjectReferenceDescriptorByName("passport").isLazy());
+
assertFalse(broker.getClassDescriptor(Passport.class).getObjectReferenceDescriptorByName("person").isLazy());
+
+ // insert
+ Person pers = new Person(name);
+ Passport pass = new Passport(number);
+ broker.beginTransaction();
+ // store plain Person to assign PK
+ broker.store(pers);
+ // set PK/FK of Passport
+ pass.setId(pers.getId());
+ // set references
+ pers.setPassport(pass);
+ pass.setPerson(pers);
+ broker.store(pers);
+ broker.commitTransaction();
+
+ // lookup
+ Identity oid = broker.serviceIdentity().buildIdentity(pers);
+ Person pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNotNull(pers_new);
+ assertNotNull(pers_new.getPassport());
+ assertNotNull(pers_new.getPassport().getPerson());
+
+ // update
+ broker.beginTransaction();
+ pers_new.setName(name + "_updated");
+ pers_new.getPassport().setNumber(number + "_updated");
+ broker.store(pers_new);
+ broker.commitTransaction();
+
+ // lookup
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNotNull(pers_new);
+ assertNotNull(pers_new.getPassport());
+ assertEquals(name + "_updated", pers_new.getName());
+ assertEquals(number + "_updated", pers_new.getPassport().getNumber());
+
+ // update nullify reference, with proxy references enabled, this result
+ // in unexpected proxy placeholder intead of null reference
+ broker.beginTransaction();
+ broker.delete(pers_new.getPassport());
+ pers_new.setPassport(null);
+ broker.store(pers_new);
+ broker.commitTransaction();
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNull(pers_new.getPassport());
+ assertEquals(name + "_updated", pers_new.getName());
+
+ // delete
+ broker.beginTransaction();
+ // first delete the object with constraint
+ broker.delete(pers_new.getPassport());
+ // not needed, but this reduce the number of generated queries
+ pers_new.setPassport(null);
+ broker.delete(pers_new);
+ broker.commitTransaction();
+ pers_new = (Person) broker.getObjectByIdentity(oid);
+ assertNull(pers_new);
+ }
+
+
+
+ public static class Person implements Serializable
+ {
+ private Integer id;
+ private String name;
+ private Passport passport;
+
+ public Person()
+ {
+ }
+
+ public Person(String name)
+ {
+ this.name = name;
+ }
+
+ public Integer getId()
+ {
+ return id;
+ }
+
+ public void setId(Integer id)
+ {
+ this.id = id;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public void setName(String name)
+ {
+ this.name = name;
+ }
+
+ public Passport getPassport()
+ {
+ return passport;
+ }
+
+ public void setPassport(Passport passport)
+ {
+ this.passport = passport;
+ }
+ }
+
+ public static class Passport implements Serializable
+ {
+ private Integer id;
+ private String number;
+ private Person person;
+
+ public Passport()
+ {
+ }
+
+ public Passport(String number)
+ {
+ this.number = number;
+ }
+
+ public Integer getId()
+ {
+ return id;
+ }
+
+ public void setId(Integer id)
+ {
+ this.id = id;
+ }
+
+ public String getNumber()
+ {
+ return number;
+ }
+
+ public void setNumber(String number)
+ {
+ this.number = number;
+ }
+
+ public Person getPerson()
+ {
+ return person;
+ }
+
+ public void setPerson(Person person)
+ {
+ this.person = person;
+ }
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]