My best guess at the moment is you are not registering it in your
DataNode or you have a class path issue or you haven't implemented an
ExtendedType for Cayenne to know how to deal with it. Actually,
java.util.UUID is not a Cayenne ExtendedType and you probably need a
wrapper around it for Cayenne to be able to read/write the type and
work with the data.
Take a look at:
http://cayenne.apache.org/doc/api/org/apache/cayenne/access/types/ExtendedType.html
On Fri, Aug 1, 2008 at 1:29 PM, Chris Gamache <cgamach..mail.com> wrote:
> 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:43:55 EDT