I am trying to generate Hibernate mapping files from
Oracle database. We have many unique indexes with sql
functions. For
CREATE UNIQUE INDEX UK_EQUIPMENT
ON PTH_EQUIPMENT (LOWER("NAME")).
Oracle assigns a unique column names (something like
SYS_NC0014$) for those index. Middlegen is not
handling these kind of columns and throws the error.
[middlegen] java.lang.IllegalArgumentException: There is
no column named SYS_NC0
0011$ in the table named PTH_EQUIPMENT
[middlegen] at middlegen.DbTable.getColumn
(DbTable.java:309)
[middlegen] at
middlegen.MiddlegenPopulator.addColumns
(MiddlegenPopulator.ja
va:1012)
[middlegen] at middlegen.MiddlegenPopulator.populate
(MiddlegenPopulator.java
:217)
[middlegen] at middlegen.MiddlegenTask.execute
(MiddlegenTask.java:432)
[middlegen] at
org.apache.tools.ant.UnknownElement.execute
(UnknownElement.ja
va:275)
[middlegen] at org.apache.tools.ant.Task.perform
(Task.java:364)
[middlegen] at org.apache.tools.ant.Target.execute
(Target.java:341)
[middlegen] at
org.apache.tools.ant.Target.performTasks
(Target.java:369)
[middlegen] at
org.apache.tools.ant.Project.executeTarget
(Project.java:1214)
[middlegen] at
org.apache.tools.ant.Project.executeTargets
(Project.java:1062
)
[middlegen] at org.apache.tools.ant.Main.runBuild
(Main.java:673)
[middlegen] at org.apache.tools.ant.Main.startAnt
(Main.java:188)
[middlegen] at
org.apache.tools.ant.launch.Launcher.run
(Launcher.java:196)
[middlegen] at
org.apache.tools.ant.launch.Launcher.main
(Launcher.java:55)
BUILD FAILED
C:\Projects\tools\Middlegen-Hibernate-r5\atb-
build.xml:148: java.lang.IllegalArg
umentException: There is no column named
SYS_NC00011$ in the table named PTH_EQU
IPMENT
Is there any solution?
Logged In: YES
user_id=601708
What version of middlegen are you using?
What db version are you using?
Can you try with middlegen built from CVS.
Can you attach a SQL script to create the table and unique
constraint so we can reproduce the issue.
Ben
Logged In: YES
user_id=1209902
I am using Middlegen 2.1 (ie, latest stable version) and Oracle
9i.
The following is the script used to create the
table/constraints.
CREATE TABLE PTH_EQUIPMENT
(
EQUIPMENT_ID NUMBER(10) NOT NULL,
NAME VARCHAR2(200) NOT NULL,
NO_OF_BLOCKS_PROCESSED NUMBER(10) NOT
NULL,
PROCESSING_CAPACITY NUMBER(10) NOT NULL,
LAST_RESET_DATE DATE,
DESCRIPTION VARCHAR2(2000),
INSERT_USER NUMBER(10) NOT NULL,
INSERT_DATE DATE NOT NULL,
UPDATE_USER NUMBER(10),
UPDATE_DATE DATE
)
TABLESPACE ATB_DATA
PCTUSED 40
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 40K
NEXT 40K
MINEXTENTS 1
MAXEXTENTS 505
PCTINCREASE 50
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
CREATE UNIQUE INDEX PK_EQUIPMENT_EQUIPMENT_ID ON
PTH_EQUIPMENT
(EQUIPMENT_ID)
LOGGING
TABLESPACE ATB_INDEX
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 40K
NEXT 40K
MINEXTENTS 1
MAXEXTENTS 505
PCTINCREASE 50
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT
)
NOPARALLEL;
CREATE UNIQUE INDEX UK_EQUIPMENT ON PTH_EQUIPMENT
(LOWER("NAME"))
LOGGING
TABLESPACE ATB_INDEX
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 40K
NEXT 40K
MINEXTENTS 1
MAXEXTENTS 505
PCTINCREASE 50
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT
)
NOPARALLEL;
ALTER TABLE PTH_EQUIPMENT ADD (
CONSTRAINT PK_EQUIPMENT_EQUIPMENT_ID PRIMARY KEY
(EQUIPMENT_ID)
USING INDEX
TABLESPACE ATB_INDEX
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 40K
NEXT 40K
MINEXTENTS 1
MAXEXTENTS 505
PCTINCREASE 50
FREELISTS 1
FREELIST GROUPS 1
));
It gives the problem for the unique constraints
UK_EQUIPMENT.
I will try to use middlegen after getting from CVS. Let me
know if you are able to guess the problem from this input.
Thanks.
Logged In: YES
user_id=601708
I ran the script on an Oracle8i database and middlegen
worked with that.
Can you please try with a version of middlegen built from CVS
and let me know if it works.
I will install Oracle9i if you are still having a problem.
Ben
Logged In: YES
user_id=468236
The problem is not the unique constraint but the fact that
we have a function based index. I could reproduce this on 9i
both with unique and non-unique FBIs.
Connection.getMetaData().getIndexInfo() lists a pseudocolumn
for these indexes that is named like "SYS_NC.....$". There
seems to be no direct way to recognize these pseudocolumns
(e.g. TYPE is the same for FBIs and non-FBIs). At least they
obey the Oracle convention for internal names that normally
should not be accessed anyway, so maybe we could skip
columns ending with a "$". I've made up a patch for this,
but it's still untested.
Logged In: YES
user_id=468236
Patch # is 1219950