Hi Sridhar,

in your case you can setup two different repository and read the second one at runtime (with both jdbc-connection-descriptor declared in the default repository, in the second one only declare object metadata - then you don't need to read and merge the second ConnectionRepository) or you can modify a copy of the default repository object metadata.

http://db.apache.org/ojb/api/org/apache/ojb/broker/metadata/MetadataManager.html

I recommend to use object metadata profiles. You can handle this stuff in a startup class or something similar. Say you have two DescriptorRepository instances one for Oracle , one forAccess

MetadataManager mm = MetadataManager.getInstance();
mm.addProfile("access", accessDescriptorRepository);
mm.addProfile("oracle", accessDescriptorRepository);

Now OJB manage three DescriptorRepository instances the "default one" automatic read by OJB (access or oracle) and two profiles for use in threaded mode.

Currently OJB allows to enable per thread mode when needed. So you can enable per thread mode when needed or at startup.

mm.setEnablePerThreadChanges(true);

OJB now support per thread object metadata via a ThreadLocal instance. But you have to tell the MM which profile to use. If you now obtain a PersistenceBroker instance from the PBF you will get the "default one".
BEFORE obtain the PB instance call


mm.loadProfile("oracle");
PersistenceBroker broker = PersistenceBrokerFactory.cre....;

Now the object metadata profile for "oracle" is associated with the obtained PB instance. All further obtained PB instance of the current thread will now use the oracle profile. If you want to change the profile for current thread call loadProfile again.

hope this will help you!

regards,
Armin

Sridhar wrote:

Hi,

I need to define a repository that needs to work both in Oracle as well as MS-
Access. Some jdbc datatypes like BLOB and CLOB in Oracle maps to LONGVARBINARY and LONGVARCHAR in access. Also, on some rare occasions I need to copy data between Access and Oracle. In one case the table names are different (the table represented by class "LLEAgency"). To overcome I defined the repository for Oracle data types and change them to access data types when required. This method is on a class that extends Thread.


    public void makeAccessCompatible()
    {
        MetadataManager mdm = MetadataManager.getInstance();
        mdm.setEnablePerThreadChanges(true);
        DescriptorRepository dr = mdm.copyOfGlobalRepository();
        Iterator ir = dr.iterator();
        while(ir.hasNext())
        {
            ClassDescriptor cd = (ClassDescriptor) ir.next();
            if(cd.getClassNameOfObject().endsWith("LLEAgency"))
            {
                System.out.println(cd.getFullTableName());
                cd.setTableName("CODES_DEPARTMENTS");
            }
            FieldDescriptor[] flds = cd.getFieldDescriptions();
            for (int i = 0; i < flds.length; i++)
            {
                FieldDescriptor fd = flds[i];
                if (fd.getColumnType().toLowerCase().equals("blob"))
                {
                    fd.setColumnType("longvarbinary");
                }
                else if (fd.getColumnType().toLowerCase().equals("clob"))
                {
                    fd.setColumnType("longvarchar");
                }
            }
        }
        mdm.setDescriptor(dr);
    }

After executing this on one of the threads, I checked the repository on both the threads and they are exactly same, this is how I checked, compare the String returned from the 2 threads using

MetadataManager.getInstance().getRepository().toXML();

I have tried setting the

MetadataManager.getInstance().setEnablePerThreadChanges(true);

at various points, including the application startup. But still no luck. Looks like I am missing something very obvious here. When I get a copyofGlobalRepository, I assume I get a copy entire repository tree, with the Class, Field descriptors everything. Am I still working with the same object references or differet objects/references? Can anyone please help me with this?

Thanks & Regards
Sridhar


--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]




--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to