Re: Cayenne 3.0M4 ignoring extended data types

From: Chris Gamache (cgamach..mail.com)
Date: Fri Aug 01 2008 - 13:29:27 EDT

  • Next message: Michael Gentry: "Re: Cayenne 3.0M4 ignoring extended data types"

    I've been looking around, stepping through the code execution, trying to
    find where Cayenne goes digging into the ExtendedTypeMap, and to see if that
    step gets omitted when dealing with referenced tables. I'm still looking,
    but I did find one odd thing so far:

    In org.apache.cayenne.access.jdbc.ColumnDescriptor, the javaClass for the
    column with the extended type is null. It should most definitely be
    java.util.UUID as evidenced by the entry in the XML file. No other column
    (at least none that I've looked at) has a null for the javaClass. Is this
    normal, or a symptom of the type of problem that exists?
    On Thu, Jul 31, 2008 at 11:55 PM, Chris Gamache <cgamach..mail.com> wrote:

    > 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 <blacknex..mail.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 <cgamach..mail.com>
    > wrote:
    > >> On Thu, Jul 31, 2008 at 12:38 PM, Michael Gentry
    > >> <blacknex..mail.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...
    > >>
    > >
    >



    This archive was generated by hypermail 2.0.0 : Fri Aug 01 2008 - 13:30:00 EDT