POJOs জন্য লেনদেন

আমি একটি পদ্ধতি বাস্তবায়ন করছি যা এমন কিছু করে:

...
try {
   myPojo.setProperty("foo");
   myService.execute(myPojo);
} catch (Exception e) {
   logger.error(e.getMessage(), e);
}
...

যদি কিছু ব্যতিক্রম আমার সেবা দ্বারা নিহিত হয় তাহলে পোজে সম্পত্তি ব্লকের চেষ্টা করে নতুন মান থাকবে। যদি কিছু ভুল হয়ে যায় তবে কজো পরিবর্তনগুলির জন্য একটি ধরনের লেনদেন শুরু করার জন্য এটি পুনরায় চালু করুন?

কিছুটা এইরকম:

PojoTransaction pt = startPojoTransaction();
transactionedPojo = pt.handleByTransaction(myPojo);
try {
   transactionedPojo.setProperty("foo");
   myService.execute(transactionedPojo);
   pt.commit;
} catch (Exception e) {
   logger.error(e.getMessage(), e);
}

অথবা কিছু অনুরূপ ...

0
যোগ
মতামত: 1

3 উত্তর

Take a look at the Memento Pattern, it includes a Java example.
http://en.wikipedia.org/wiki/Memento_pattern

0
যোগ

প্রশ্ন একটি বিট অস্পষ্ট, কিন্তু আপনি লেনদেন পরিচালনার জন্য মৌলিক নকশা প্যাটার্ন সঙ্গে কুস্তি হয় বলে মনে হচ্ছে। আপনি এখানে ব্যবহৃত প্যাটার্ন উত্পাদন মধ্যে চলে গেছে যে অভিজ্ঞতা থেকে প্রচুর উপকৃত হবে:

http://static.springsource.org /spring/docs/3.0.x/spring-framework-reference/html/transaction.html

সম্ভবত বসন্ত লেনদেন ব্যবস্থাপনা আপনার প্রকল্পের জন্য ভালভাবে আপনার পক্ষে উপযুক্ত হবে।

0
যোগ

আমি ধারণা সঙ্গে চারপাশে toyed, এই নিখুঁত থেকে দূরে, ধারণা মাত্র একটি সহজ প্রমাণ। এই বাস্তবায়ন মধ্যে ক্ষত রয়েছে:

  • শুধুমাত্র প্রদত্ত উৎসের প্যারামিটারাল কন্সট্রাক্টরকে কল করার চেষ্টা করে টার্গেট-অনুলিপি তৈরি করতে অবজেক্টের জন্য, সঠিক কন্সট্রাকটর নির্বাচন করতে কিছু লজিকের প্রয়োজন হবে (অথবা শুধুমাত্র Cloneables সমর্থন করে?)
  • শ্রেণীতে শুধুমাত্র ক্ষেত্রগুলি ঘোষণা করা হয় না, সুপারক্লাস্সের নয় (এই সমস্যাটি উত্তরাধিকারের বৃত্তের মধ্য দিয়ে হাঁটা এবং কোনও সুপারclass ক্ষেত্র অনুলিপি করা যেতে পারে)
  • যদি ক্ষেত্রগুলি জটিল ধরনের হয় তবে শুধুমাত্র রেফারেন্সগুলি লক্ষ্য-বস্তুতে অনুলিপি করা হয়, তাই তাদের কোনও পরিবর্তন লেনদেন হবে না, কারণ উৎস এবং লক্ষ্য উভয়ই একই দৃষ্টিকোণ (পুনরাবৃত্তিকৃত নেস্টেড বস্তুর কপি তৈরি করে এবং তাদের মানগুলি অনুলিপি করা, সমগ্র বস্তু-গ্রাফের মাধ্যমে হাঁটার জন্য, উত্স থেকে শুরু করে, এবং তারপর কমিট-টাইম-এর বিপরীতে এটি করা প্রয়োজন)

কিন্তু, এখানে থেকে উন্নতি, আমি এটা খুব ব্যবহারযোগ্য হতে পারে বিশ্বাস। এখানে পিওসি:

import java.lang.reflect.Field;

import org.junit.Assert;
import org.junit.Test;

public class PojoTransactionTest
{
    public static class PojoTransaction
    {
        /**
         * This is the original (unmodified) object
         */
        private T source;

        /**
         * This is the object modified by within the transaction
         */
        private T target;

        /**
         * Creates a new transaction for the given source object
         * @param source    Source object to modify transactionally
         */
        public PojoTransaction(T source)
        {
            try
            {
                this.source = source;
                this.target = (T)source.getClass().newInstance(); //Note: this only supports parameterless constructors

                copyState(source, target);
            }
            catch(Exception e)
            {
                throw new RuntimeException("Failed to create PojoTransaction", e);
            }
        }

        /**
         * Copies state (member fields) from object to another
         * @param from      Object to copy from
         * @param to        Object to copy to
         * @throws IllegalAccessException
         */
        private void copyState(T from, T to) throws IllegalAccessException
        {
            //Copy internal state to target, note that this will NOT copy fields from superclasses
            for(Field f : from.getClass().getDeclaredFields())
            {
                f.setAccessible(true);
                f.set(to, f.get(from));
            }
        }

        /**
         * Returns the transaction target object, this is the one you should modify during transaction
         * @return Target object
         */
        public T getTransactionTarget()
        {
            return target;
        }

        /**
         * Copies the changes from target object back to original object
         */
        public void commit()
        {
            try
            {
                copyState(target, source);
            }
            catch(Exception e)
            {
                throw new RuntimeException("Failed to change state of original object", e);
            }
        }
    }

    public static class TestData
    {
        private String strValue = "TEST";
        private int intValue = 1;
        private float floatValue = 3.1415f;

        public String getStrValue()
        {
            return strValue;
        }

        public void setStrValue(String strValue)
        {
            this.strValue = strValue;
        }

        public int getIntValue()
        {
            return intValue;
        }

        public void setIntValue(int intValue)
        {
            this.intValue = intValue;
        }

        public float getFloatValue()
        {
            return floatValue;
        }

        public void setFloatValue(float floatValue)
        {
            this.floatValue = floatValue;
        }

    }

    @Test
    public void testTransaction()
    {
        //Create some test data
        TestData orig = new TestData();

        //Create transaction for the test data, get the "transaction target"-object from transaction
        PojoTransaction tx = new PojoTransaction(orig);
        TestData target = tx.getTransactionTarget();
        target.setFloatValue(1.0f);
        target.setIntValue(5);
        target.setStrValue("Another string");

        //Original object is still at the original values
        Assert.assertEquals(1, orig.getIntValue());
        Assert.assertEquals(3.1415f, orig.getFloatValue(), 0.001f);
        Assert.assertEquals("TEST", orig.getStrValue());

        //Commit transaction
        tx.commit();

        //The "orig"-object should now have the changes made to "transaction target"-object
        Assert.assertEquals(5, orig.getIntValue());
        Assert.assertEquals(1.0f, orig.getFloatValue(), 0.001f);
        Assert.assertEquals("Another string", orig.getStrValue());
    }

}
0
যোগ