cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Chris Gamache" <cgama...@gmail.com>
Subject Re: Cayenne 3.0M4 ignoring extended data types
Date Fri, 01 Aug 2008 03:55:16 GMT
Every time I create a DataContext, it gets created with makeContext. I
pass in different the config locations.

I didn't post the code for PostgresUniqueidentifier or PostgresMoney
because I didn't think the guts of those classes really mattered, but
more that they existed in the first place. PostgresUniqueidentifier
will take a java.util.UUID and allow it to be treated as a JDBC string
with no explicit typecasting when using PostgreSQL. PostgresMoney
wraps itself aroung the PGmoney class from the PgJDBC library and
allows seamless access to that datatype. I don't  set them up in the
XML. Should I? Is there a 3.0 feature I'm missing? I'll be glad to
post those classes if you'd like to see them. It's just a whole lot
for a listserv. Just say the word...

They themselves function properly (at least in 2.0 they did) ...

On 7/31/08, Michael Gentry <blacknext@gmail.com> wrote:
> It is a lot to dig through ... :-)
>
> Some more questions:
>
> You show regsitering PostgresUniqueIdentifier and PostgresMoney in the
> code, but they are not in the XML.  Is this a red herring or an
> omission?  Do you have the full class name, including package name, in
> the XML for your types?
>
> Also, are you registering your ExtendedTypes in ALL DataNodes?  You
> mentioned having having multiple cayenne.xml files and the
> ExtendedTypes need to be registered in ALL DataNodes because each
> DataNode is responsible for doing type translation processing.
>
> And, do your ExtendedTypes implement ExtendedType?  Or subclass
> something which does?
>
> Thanks.
>
>
> On Thu, Jul 31, 2008 at 1:13 PM, Chris Gamache <cgamache@gmail.com> wrote:
>> On Thu, Jul 31, 2008 at 12:38 PM, Michael Gentry
>> <blacknext@gmail.com>wrote:
>>
>>> Could you give an example of how you are using and declaring the
>>> extended types?  A lot of work has been done in that department since
>>> 2.x, including adding enumeration support.
>>
>>
>> Sure!
>>
>>  public DataContext makeContext(final String configuration, final String
>> classPath, final String nodeName ) {
>>
>>  if (!initialized) {
>>   DefaultConfiguration dc = new DefaultConfiguration(configuration);
>>   dc.addClassPath(classPath);
>>   boolean cayenneNotInitialized = false;
>>   try {
>>    Configuration conf = Configuration.getSharedConfiguration();
>>   } catch (Exception e) {
>>    cayenneNotInitialized = true;
>>   }
>>
>>   if (cayenneNotInitialized) {
>>    dc.initializeSharedConfiguration(dc);
>>   } else {
>>    try{
>>     dc.initialize();
>>    }catch(Exception e){
>>     throw new ConfigurationException();
>>    }
>>   }
>>
>>   for (Object d : dc.getDomain().getDataMaps().toArray()) {
>>    DataMap dm = (DataMap)d;
>>   }
>>   for (Object d : dc.getDomain().getDataNodes().toArray()) {
>>    DataNode dn = (DataNode)d;
>>   }
>> *  //Heres where I'm registering the types...*
>>
>>
>> dc.getDomain().getNode(nodeName).getAdapter().getExtendedTypes().registerType(new
>> PostgresUniqueIdentifier());
>>
>> dc.getDomain().getNode(nodeName).getAdapter().getExtendedTypes().registerType(new
>> PostgresMoney());
>>   Configuration sharedConfig = null;
>>   try {
>>     sharedConfig = Configuration.getSharedConfiguration();
>>    Iterator<DataMap> dcDataMapItr =
>> dc.getDomain().getDataMaps().iterator();
>>    while (dcDataMapItr.hasNext()) {
>>     sharedConfig.getDomain().addMap(dcDataMapItr.next());
>>    }
>>    Iterator<DataNode> dcDataNodeItr =
>> dc.getDomain().getDataNodes().iterator();
>>    while(dcDataNodeItr.hasNext()) {
>>     sharedConfig.getDomain().addNode(dcDataNodeItr.next());
>>    }
>>   } catch (Exception e) {
>>    Configuration.initializeSharedConfiguration(dc);
>>   }
>>
>>   initialized = true;
>>  }
>>  for (Object d :
>> Configuration.getSharedConfiguration().getDomain().getDataMaps().toArray())
>> {
>>   DataMap dm = (DataMap)d;
>>  }
>>  for (Object d :
>> Configuration.getSharedConfiguration().getDomain().getDataNodes().toArray())
>> {
>>   DataNode dn = (DataNode)d;
>>  }
>>
>>  return DataContext.createDataContext();
>>  }
>>
>> And here's some XML for declaring the fields...
>>  <obj-entity name="CompanyTable" className="com.user.rdbms.CompanyTable"
>> dbEntityName="company_table">
>>  <obj-attribute name="code" type="java.lang.Integer"
>> db-attribute-path="code"/>
>>  <obj-attribute name="comment" type="java.lang.String"
>> db-attribute-path="comment"/>
>>  <obj-attribute name="companyName" type="java.lang.String"
>> db-attribute-path="company_name"/>
>>  <obj-attribute name="companyUuid" type="java.util.UUID"
>> db-attribute-path="company_uuid"/>
>>  ....and so on
>>
>>  <db-entity name="company_table">
>>  <db-attribute name="code" type="INTEGER" length="10"/>
>>  <db-attribute name="comment" type="CLOB" length="2147483647"/>
>>  <db-attribute name="company_name" type="VARCHAR" length="50"/>
>>  <db-attribute name="company_uuid" type="OTHER" length="2147483647"/>
>>  ....and so on
>>
>>  <db-relationship name="toCompanyTable" source="user_table"
>> target="company_table" toMany="false">
>>  <db-attribute-pair source="company_name" target="company_name"/>
>>  </db-relationship>
>>
>> and user_table has a company_name which is used as the unqiue key to
>> retrieve the relevant company from the user.
>>
>> So then....
>>
>>  protected UserTable getUser() {
>>  if(context == null){
>>   this.context = ContextCreator.makeContext(..., ..., ...); //with
>> real values for "..."
>>  }
>>  if(user == null){
>>   Expression exp =
>> ExpressionFactory.matchExp(UserTable.USER_UUID_PROPERTY,
>> userUUID);
>>   SelectQuery select = new SelectQuery(UserTable.class, exp);
>>   user = (UserTable) DataObjectUtils.objectForQuery(context, select);
>>   if(user == null)  throw new IllegalStateException("user " + userUUID + "
>> not found);
>>  }
>>  return user;
>>  }
>>
>> And then...
>>
>> protected CompanyTable getCompany() {
>>  if(company == null){
>>   company = getUser().getToCompanyTable();
>>   if(company == null) throw new IllegalStateException("Company not found
>> for user " + getUser().getUserUuid());
>>  }
>>  return company;
>>  }
>>
>>
>> And I can use user.getUserUuid() with no problems, but if I try to do
>> company.getCompanyUuid() where company was retrieved using
>> user.getToCompanyTable() it bombs as though the ExtendedTypes aren't
>> there.
>>
>> I hope this isn't too much to dig through....
>>
>> Thanks again for taking a peek...
>>
>

Mime
View raw message