Hi Javier,
This is definitely a limitation, and as you've discovered, there are 2
issues here.
1. Dot is a standard path separator in Cayenne (you are the first one
in so many years of Cayenne who has dots in column names; I am not
saying this is illegal, rather that nobody in the community has done
it before). So looks like we'll need to have some internal escaping of
dots invisible to the user. May not be too hard to implement (?)
2. Quoting identifiers. This is something that we were going to do for
some time, but never got around to actually doing it (we have a few
Jiras on it).
There is a workaround for #2 - use quotes in the modeler for the
attribute names. There's no workaround for #1, and this is a bug IMO
(and as I said, hopefully not a hard one to fix). If you can open a
Jira on that, I'd appreciate it. If not, I can do it myself.
Thanks,
Andrus
On Jan 13, 2009, at 6:21 PM, Javi Peter wrote:
Hi again,
I´ve been doing some debugging and I think I have found the root of
the problem. In order to do the following debugs I had to edit the
mapping file manually (because the modeler hangs).
We have to take into account that a query statement for a column
"mail.host" of the table "account" like "SELECT t0.mail.host,
t0.others FROM account t0" will fail, and it must be queried like
"SELECT t0.`mail.host`, t0.others FROM account t0".
I launched a simple test and it failed with this exception:
INFO QueryLogger: *** error.
org.apache.cayenne.exp.ExpressionException: [v.2.0.4 October 8 2007]
Can't resolve path component: [account.mail].
at org.apache.cayenne.map.Entity$PathIterator.next(Entity.java:363)
at
org
.apache
.cayenne
.access
.trans.SelectTranslator.appendQueryColumns(SelectTranslator.java:377)
at
org
.apache
.cayenne
.access
.trans.SelectTranslator.buildResultColumns(SelectTranslator.java:338)
at
org
.apache
.cayenne
.access.trans.SelectTranslator.createSqlString(SelectTranslator.java:
113)
at
org
.apache
.cayenne
.dba
.mysql
.MySQLSelectTranslator.createSqlString(MySQLSelectTranslator.java:31)
at
org
.apache
.cayenne
.access.trans.QueryAssembler.createStatement(QueryAssembler.java:95)
[...]
The problem there was a StringTokenizer in
org.apache.cayenne.map.Entity (line 331) which in method next()
thinks that the dot of "mail.host" is another token so it treats it
like two attributes instead of one. Changing manually the variable
on debug mode and changing back again after the tokenizer, it
finally forms the SQL statement, but the bad one, so again we get an
exception:
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column
't0.mail.host' in 'field list'
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1026)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
at
com
.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:
1761)
[..]
A search for the root of this exception lead me to
org.apache.cayenne.access.trans.SelectTranslator, where the
ArrayList "colums" gets filled and there it is the ColumnDescriptor
for our column, and the qualifiedColumnName is "t0.mail.host", which
of course won´t work. Changing it to "t0.`mail.host`" builds the
correct SELECT statement and finally works.
Is this a bug or am I missing something?
Javier Rubio
From: [email protected]
To: [email protected]
Subject: RE: Modeler Exception for using dots on attributes
Date: Tue, 13 Jan 2009 09:07:09 +0100
Sure: "account" is the table, "mail.imap.minidletime" is the column
name.
Thanks in advance
Javier
From: [email protected]
To: [email protected]
Subject: Re: Modeler Exception for using dots on attributes
Date: Mon, 12 Jan 2009 19:32:08 +0200
So "account.mail" is a COLUMN name? Not a table + column name?
Could you clarify please.
Thanks,
Andrus
On Jan 12, 2009, at 7:10 PM, Javi Peter wrote:
Hi,
each time I reverse engineer a database schema with dots (e.g.
"mail.account"), the modeler hangs. If I hit Validate Project, it
shows the exception shown at the end of the email.
It also happens if I create manually the ObjAttribute.
Any ideas of why this happens and how to workaround this (I MUST
use
dots).
Thanks,
Javier Rubio
CayenneModeler Info
Version: 2.0.4
Build Date: October 8 2007
Exception:
=================================
org.apache.cayenne.exp.ExpressionException: [v.2.0.4 October 8
2007]
Can't resolve path component: [account.mail].
at org.apache.cayenne.map.Entity$PathIterator.next(Entity.java:
363)
at
org
.apache.cayenne.map.ObjAttribute.getDbAttribute(ObjAttribute.java:
147)
at
org
.apache
.cayenne
.util.EntityMergeSupport.getMeaningfulFKs(EntityMergeSupport.java:
173)
at
org
.apache
.cayenne
.modeler
.dialog
.objentity
.EntitySyncController.createMerger(EntitySyncController.java:69)
at
org
.apache
.cayenne
.modeler
.action.DbEntitySyncAction.synchDbEntity(DbEntitySyncAction.java:
75)
at
org
.apache
.cayenne
.modeler
.action.DbEntitySyncAction.performAction(DbEntitySyncAction.java:
60)
at
org
.apache
.cayenne
.modeler.util.CayenneAction.actionPerformed(CayenneAction.java:163)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown
Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown
Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at
javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown
Source)
at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown
Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown
Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown
Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown
Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
_________________________________________________________________
Descubre todas las formas en que puedes estar en contacto con
amigos
y familiares.
http://www.microsoft.com/windows/windowslive/default.aspx
_________________________________________________________________
Chatea sin límites en Messenger con la tarifa plana de Orange
http://serviciosmoviles.es.msn.com/messenger/orange.aspx
_________________________________________________________________
¿Quieres ver los mejores videos de MSN? Enciende Messenger TV
http://messengertv.msn.com/mkt/es-es/default.htm