Search in sources :

Example 1 with OtherDetail

use of org.datanucleus.samples.models.hashsetcollection.OtherDetail in project tests by datanucleus.

the class AttachDetachReplicateTest method testMoveAcrossDatastoresWithRelation.

/**
 * Test of detaching from one datastore and persisting the objects to another.
 * As we copy a group of related objects JPOX should serialize SQLs in the
 * way that do not break foreign key constraints.
 */
public void testMoveAcrossDatastoresWithRelation() {
    PersistenceManagerFactory pmf2 = getPersistenceManagerFactory2();
    try {
        PersistenceManager pm1 = pmf.getPersistenceManager();
        Detail detail = null;
        // Persist in first DB
        Transaction tx = null;
        try {
            tx = pm1.currentTransaction();
            tx.begin();
            // Create some dummy records, so we offset the identity values and make a valid test
            pm1.makePersistent(new Master());
            pm1.makePersistent(new Master());
            pm1.makePersistent(new Master());
            pm1.makePersistent(new Detail());
            pm1.makePersistent(new Detail());
            pm1.makePersistent(new Detail());
            pm1.makePersistent(new OtherDetail());
            pm1.makePersistent(new OtherDetail());
            pm1.makePersistent(new OtherDetail());
            // Create our test objects, Master with related Detail and OtherDetail
            Master master1 = new Master();
            master1.setId("master");
            Detail detail1 = new Detail();
            detail1.setId("detail");
            master1.addDetail(detail1);
            detail1.setMaster(master1);
            OtherDetail otherDetail1 = new OtherDetail();
            otherDetail1.setId("otherDetail1");
            master1.addOtherDetail(otherDetail1);
            otherDetail1.setMaster(master1);
            pm1.makePersistent(detail1);
            // Detach it for copying
            pm1.getFetchPlan().addGroup("all");
            pm1.getFetchPlan().setMaxFetchDepth(2);
            detail = (Detail) pm1.detachCopy(detail1);
            tx.commit();
        } catch (JDOUserException ue) {
            LOG.error(ue);
            fail("Exception thrown while creating object in first datastore : " + ue.getMessage());
        } finally {
            if (tx != null && tx.isActive()) {
                tx.rollback();
            }
            pm1.close();
        }
        // Check our detached objects
        assertNotNull(detail.getMaster());
        assertEquals(detail.getMaster().getOtherDetails().size(), 1);
        // Copy to other DB
        PersistenceManager pm2 = pmf2.getPersistenceManager();
        try {
            tx = pm2.currentTransaction();
            tx.begin();
            // Persist graph of three transient objects to see if this datastore works
            Master master2 = new Master();
            master2.setId("master2");
            Detail detail2 = new Detail();
            detail2.setId("detail2");
            master2.addDetail(detail2);
            detail2.setMaster(master2);
            OtherDetail otherDetail2 = new OtherDetail();
            otherDetail2.setId("otherDetail2");
            master2.addOtherDetail(otherDetail2);
            otherDetail2.setMaster(master2);
            pm2.makePersistent(detail2);
            // Replicate object graph of three detached objects from datastore 1
            pm2.makePersistent(detail);
            tx.commit();
        } catch (JDOUserException ue) {
            LOG.error(ue);
            fail("Exception thrown while copying object into second datastore : " + ue.getMessage());
        } finally {
            if (tx != null && tx.isActive()) {
                tx.rollback();
            }
        }
        // Check the persistence in the second datastore
        try {
            tx = pm2.currentTransaction();
            tx.begin();
            // Use Extent since PM may have just put object in cache.
            Extent e = pm2.getExtent(Master.class);
            Iterator iter = e.iterator();
            int noOfMasters = 0;
            while (iter.hasNext()) {
                noOfMasters++;
                iter.next();
            }
            assertTrue("Number of masters retrieved from second datastore is incorrect : was " + noOfMasters + " but should have been 2", noOfMasters == 2);
            e = pm2.getExtent(OtherDetail.class);
            iter = e.iterator();
            int noOfOtherDetails = 0;
            while (iter.hasNext()) {
                noOfOtherDetails++;
                iter.next();
            }
            assertTrue("Number of otherdetails retrieved from second datastore is incorrect : was " + noOfOtherDetails + " but should have been 2", noOfOtherDetails == 2);
            tx.commit();
        } catch (JDOUserException ue) {
            LOG.error(ue);
            fail("Exception thrown while querying object in second datastore : " + ue.getMessage());
        } finally {
            if (tx != null && tx.isActive()) {
                tx.rollback();
            }
            pm2.close();
        }
    } finally {
        // Clean up our data in the main DB
        clean(Detail.class);
        clean(OtherDetail.class);
        clean(Master.class);
        // Clean up data in the other DB
        PersistenceManager pm = pmf2.getPersistenceManager();
        Transaction tx = pm.currentTransaction();
        try {
            // delete all Detail objects
            tx.begin();
            Extent ext = pm.getExtent(Detail.class, true);
            Iterator it = ext.iterator();
            while (it.hasNext()) {
                Object o = it.next();
                pm.deletePersistent(o);
            }
            tx.commit();
            // delete all OtherDetail objects
            tx.begin();
            ext = pm.getExtent(OtherDetail.class, true);
            it = ext.iterator();
            while (it.hasNext()) {
                Object o = it.next();
                pm.deletePersistent(o);
            }
            tx.commit();
            // delete all Master objects
            tx.begin();
            ext = pm.getExtent(Master.class, true);
            it = ext.iterator();
            while (it.hasNext()) {
                Object o = it.next();
                pm.deletePersistent(o);
            }
            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
            pm.close();
        }
    }
}
Also used : Master(org.datanucleus.samples.models.hashsetcollection.Master) OtherDetail(org.datanucleus.samples.models.hashsetcollection.OtherDetail) Transaction(javax.jdo.Transaction) PersistenceManager(javax.jdo.PersistenceManager) Extent(javax.jdo.Extent) Iterator(java.util.Iterator) PersistenceManagerFactory(javax.jdo.PersistenceManagerFactory) JDOUserException(javax.jdo.JDOUserException) OtherDetail(org.datanucleus.samples.models.hashsetcollection.OtherDetail) Detail(org.datanucleus.samples.models.hashsetcollection.Detail)

Example 2 with OtherDetail

use of org.datanucleus.samples.models.hashsetcollection.OtherDetail in project tests by datanucleus.

the class AttachDetachReplicateTest method testSetDetachedObjectOnFieldInPCNewObject.

/**
 * Test checks if we can detach a graph of objects where there are
 * persistent and/or detached objects inside this graph
 *
 * Test adding a detached object to a PC_NEW object graph (after it has been made persistent)
 * TODO Change the sample to be Company
 */
@TransactionMode(PESSIMISTIC)
public void testSetDetachedObjectOnFieldInPCNewObject() {
    PersistenceManagerFactory pmf2 = getPersistenceManagerFactory2();
    try {
        PersistenceManager pm = null;
        Transaction tx = null;
        Master detachedMaster = null;
        try {
            pm = pmf.getPersistenceManager();
            tx = pm.currentTransaction();
            tx.begin();
            Master master = new Master();
            master.setId("Master3");
            pm.makePersistent(master);
            pm.getFetchPlan().setMaxFetchDepth(2);
            detachedMaster = (Master) pm.detachCopy(master);
            tx.commit();
        } catch (JDOUserException ue) {
            LOG.error(ue);
            fail("Exception thrown while performing test : " + ue.getMessage());
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
            pm.close();
        }
        // Associate with the detached master in a different datastore
        try {
            pm = pmf2.getPersistenceManager();
            tx = pm.currentTransaction();
            tx.begin();
            tx.setRetainValues(true);
            Detail detail = new Detail();
            detail.setId("Detail3");
            pm.makePersistent(detail);
            OtherDetail otherDetail = new OtherDetail();
            otherDetail.setId("OtherDetail3");
            pm.makePersistent(otherDetail);
            assertTrue(JDOHelper.isDetached(detachedMaster));
            // set a detached object to a field in a PC_NEW instance
            detail.setMaster(detachedMaster);
            detachedMaster.addDetail(detail);
            otherDetail.setMaster(detachedMaster);
            detachedMaster.addOtherDetail(otherDetail);
            tx.commit();
            assertFalse("detail object is still detached, but should have been attached", JDOHelper.isDetached(detail));
            assertNotNull("detail object has master which is null!", detail.getMaster());
            assertFalse("detached has master that has not been attached", JDOHelper.isDetached(detail.getMaster()));
            assertTrue("detail object has master but number of other details is 0!", detail.getMaster().getOtherDetails().size() > 0);
            assertFalse("detail object has master that has otherdetail that is detached still!", JDOHelper.isDetached(detail.getMaster().getOtherDetails().iterator().next()));
            assertFalse("otherdetail object is still detached, but should have been attached", JDOHelper.isDetached(otherDetail));
            assertNotNull("otherdetail object has master which is null!", otherDetail.getMaster());
            assertFalse("otherdetail has master that has not been attached!", JDOHelper.isDetached(otherDetail.getMaster()));
            // Detach the detail
            tx.begin();
            pm.getFetchPlan().addGroup("all");
            pm.getFetchPlan().setMaxFetchDepth(2);
            Detail detachedDetail = (Detail) pm.detachCopy(detail);
            tx.commit();
            assertTrue(JDOHelper.isDetached(detachedDetail));
            assertTrue(JDOHelper.isDetached(detachedDetail.getMaster()));
            assertTrue(JDOHelper.isDetached(detachedDetail.getMaster().getOtherDetails().iterator().next()));
        } catch (JDOUserException ue) {
            LOG.error(ue);
            fail("Exception thrown while performing test : " + ue.getMessage());
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
            pm.close();
        }
    } finally {
        // Clean up our data in the main DB
        clean(OtherDetail.class);
        clean(Detail.class);
        clean(Master.class);
        // Clean up data in the other DB
        PersistenceManager pm = pmf2.getPersistenceManager();
        Transaction tx = pm.currentTransaction();
        try {
            // delete all Detail objects
            tx.begin();
            Extent ext = pm.getExtent(Detail.class, true);
            Iterator it = ext.iterator();
            while (it.hasNext()) {
                Object o = it.next();
                pm.deletePersistent(o);
            }
            tx.commit();
            // delete all OtherDetail objects
            tx.begin();
            ext = pm.getExtent(OtherDetail.class, true);
            it = ext.iterator();
            while (it.hasNext()) {
                Object o = it.next();
                pm.deletePersistent(o);
            }
            tx.commit();
            // delete all Master objects
            tx.begin();
            ext = pm.getExtent(Master.class, true);
            it = ext.iterator();
            while (it.hasNext()) {
                Object o = it.next();
                pm.deletePersistent(o);
            }
            tx.commit();
        } finally {
            if (tx.isActive()) {
                tx.rollback();
            }
            pm.close();
        }
    }
}
Also used : Master(org.datanucleus.samples.models.hashsetcollection.Master) OtherDetail(org.datanucleus.samples.models.hashsetcollection.OtherDetail) Transaction(javax.jdo.Transaction) PersistenceManager(javax.jdo.PersistenceManager) Extent(javax.jdo.Extent) Iterator(java.util.Iterator) PersistenceManagerFactory(javax.jdo.PersistenceManagerFactory) JDOUserException(javax.jdo.JDOUserException) OtherDetail(org.datanucleus.samples.models.hashsetcollection.OtherDetail) Detail(org.datanucleus.samples.models.hashsetcollection.Detail) TransactionMode(org.datanucleus.tests.annotations.TransactionMode)

Aggregations

Iterator (java.util.Iterator)2 Extent (javax.jdo.Extent)2 JDOUserException (javax.jdo.JDOUserException)2 PersistenceManager (javax.jdo.PersistenceManager)2 PersistenceManagerFactory (javax.jdo.PersistenceManagerFactory)2 Transaction (javax.jdo.Transaction)2 Detail (org.datanucleus.samples.models.hashsetcollection.Detail)2 Master (org.datanucleus.samples.models.hashsetcollection.Master)2 OtherDetail (org.datanucleus.samples.models.hashsetcollection.OtherDetail)2 TransactionMode (org.datanucleus.tests.annotations.TransactionMode)1