You da man Mike!
-D
On Aug 4, 2008, at 11:32 AM, Michael Gasche wrote:
No problemo, here it is (Make sure to patch it in the /web-project,
not the /core, it's easier to debug in eclipse):
Adjustment of method 'configure' in class
org.hibernate.id.SequenceGenerator:
public void configure(Type type, Properties params, Dialect dialect)
throws MappingException {
// mike: patched
final String fullClassName = dialect.getClass().getName();
final String className =
fullClassName.substring(fullClassName.lastIndexOf('.') + 1);
if (className.startsWith("Oracle")) {
sequenceName = params.getProperty(TABLE) + "_sequence";
} else {
sequenceName = PropertiesHelper.getString(SEQUENCE, params,
"hibernate_sequence");
}
parameters = params.getProperty(PARAMETERS);
String schemaName = params.getProperty(SCHEMA);
String catalogName = params.getProperty(CATALOG);
if (sequenceName.indexOf('.') < 0) {
sequenceName = Table.qualify(catalogName, schemaName,
sequenceName);
}
this.identifierType = type;
sql = dialect.getSequenceNextValString(sequenceName);
}
Note: the code actually should check the dialect once and store it
in a static type attribute, so it's done only once. But I guess,
because it's the configure-method, it's only called once for every
Entity. The constant 'TABLE' is defined in the super class
PersistentIdentifierGenerator.
/Mike
Dustin Pearce schrieb:
I like your workaround. I have a similar setup where I develop
locally in MySQL and then need to deploy to Oracle. In my case I
have existing records and so I want my fancy new Appfuse records to
start somewhere out in the 50000 range. Sadly the Hibernate
Annotation does not support initialValue so I needed to create the
Sequence in oracle and then explicitly reference the sequence in my
annotation. Not so nice, since now I can't deploy to MySQL. Would
you be so kind as to post your patch that switches the Sequence
generation code based on dialect! That would be a great head start
for me to fix this. ;-)
-D
On Aug 4, 2008, at 11:14 AM, Michael Gasche wrote:
Hi
Thanks for your answer. I've to look more detailed into this. I
wanted to make my app running on MySql and Oracle. Maybe other
people are interesetd into this: I currently made the following
workaround:
I didn't wanted to use one sequence (hibernate_sequence) on Oracle
which leads into strange primary keys for records because one
sequence distribute id's for all entities. I always use the simple
GeneratedValue annotation. I've been patching (I know, its bad)
the Hiberante SequenceGenerator. As soon as the Oracle dialect is
recognized, i prefix the sequence with the table's name (table
'project' --> rename sequence 'hibernate_sequence' to
'project_sequence'). The MySql dialect just uses the common
mechanism. So the annotation is simply '@GeneratedValue(strategy =
GenerationType.AUTO)'.
Maybe there's a better solution to my Oracle-MySql-Combo.
By the way: I just installed a productive version of my
application using AppFuse 2.0.2 + Spring MVC + Oracle 10g + MySql.
The learning curve in the beginning was appropriate (around 1-2
weeks), but this is with any framework/platform. In my opinion it
still was very worth using AppFuse. The trade off was little when
I compare to the expenses when I have to compose all good open
source components together. So, thanks Matt for that piece of
software. Me, my mac and AppFuse are a good team.
----------------------------------------------
There's still some issues:
1. Project structure:
/
-/core
-/web
I'm not an advanced maven user, but I currently have to have the
same entities in the /core and in the /web project when I'm
installing/generating entities in the core and in the web. Is
there a better project structure/setup?
2. Another thing is when it comes to Oracle and dbunit CLEAN_INSERT:
- It doesn't find the tables for inserting the data, even they
have been just created (This works with MySql). In
this case my own sequences and even the hibernate_sequence exists:
alter table data add constraint FK2EEFAA85CBA8A8 foreign key
(project_id) references project;
alter table data add constraint FK2EEFAAF79DEACC foreign key
(period_id) references period;
alter table issue add constraint FK5FDA8D985CBA8A8 foreign key
(project_id) references project;
alter table project add constraint FKED904B1997986028 foreign key
(account_id) references account;
alter table project add constraint FKED904B19A18FB88 foreign key
(country_id) references country;
alter table project add constraint FKED904B197F7917B foreign key
(project_type_id) references project_type;
alter table reference add constraint FKC8DB3F4B85CBA8A8 foreign
key (project_id) references project;
alter table risk add constraint FK356ACF85CBA8A8 foreign key
(project_id) references project;
alter table schedule add constraint FKD666929785CBA8A8 foreign key
(project_id) references project;
alter table user_role add constraint FK143BF46AF503D155 foreign
key (user_id) references app_user;
alter table user_role add constraint FK143BF46A4FD90D75 foreign
key (role_id) references role;
create sequence hibernate_sequence;
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [dbunit:operation {execution: default}]
[INFO]
------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO]
------------------------------------------------------------------------
[INFO] Error executing database operation: CLEAN_INSERT
[INFO]
------------------------------------------------------------------------
[INFO] Trace
org.apache.maven.lifecycle.LifecycleExecutionException: Error
executing database operation: CLEAN_INSERT
at
org
.apache
.maven
.lifecycle
.DefaultLifecycleExecutor
.executeGoals(DefaultLifecycleExecutor.java:583)
at
org
.apache
.maven
.lifecycle
.DefaultLifecycleExecutor
.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:499)
at
org
.apache
.maven
.lifecycle
.DefaultLifecycleExecutor
.executeGoal(DefaultLifecycleExecutor.java:478)
at
org
.apache
.maven
.lifecycle
.DefaultLifecycleExecutor
.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:330)
at
org
.apache
.maven
.lifecycle
.DefaultLifecycleExecutor
.executeTaskSegments(DefaultLifecycleExecutor.java:291)
at
org
.apache
.maven
.lifecycle
.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:142)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:336)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:129)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:287)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun
.reflect
.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun
.reflect
.DelegatingMethodAccessorImpl
.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:
315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at
org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:
430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error
executing database operation: CLEAN_INSERT
at
org.codehaus.mojo.dbunit.OperationMojo.execute(OperationMojo.java:
110)
at
org
.apache
.maven
.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:
451)
at
org
.apache
.maven
.lifecycle
.DefaultLifecycleExecutor
.executeGoals(DefaultLifecycleExecutor.java:558)
... 16 more
Caused by: org.dbunit.dataset.NoSuchTableException: data
at
org
.dbunit
.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:192)
at
org
.dbunit
.operation.DeleteAllOperation.execute(DeleteAllOperation.java:98)
at
org
.dbunit
.operation.CompositeOperation.execute(CompositeOperation.java:67)
at org.dbunit.ant.Operation.execute(Operation.java:183)
at
org.codehaus.mojo.dbunit.OperationMojo.execute(OperationMojo.java:
101)
... 18 more
Cheers, Mike
Matt Raible schrieb:
It depends on how you annotate your classes. For the classes that
use
a generated identity, it's usually some sort of increment. If you
want
sequences, you'll need to annotate your classes appropriately.
Matt
On Sat, Aug 2, 2008 at 9:10 PM, Michael Gasche <[EMAIL PROTECTED]
> wrote:
Hi
What sequence names will be used for primary keys (id) when
running
AppFuse on Oracle. I was not able to run hbm2ddl on Oracle with
AppFuse
2.0.2, so the DB has been setup more or less manually. This
seems to
work, but DB sequences are still missing.
The DB configuration is:
<
dbunit
.dataTypeFactoryName
>org.dbunit.ext.oracle.OracleDataTypeFactory</
dbunit.dataTypeFactoryName>
<dbunit.schema>SYSTEM</dbunit.schema> <!-- Make sure
to
capitalize the schema name -->
<hibernate.dialect>org.hibernate.dialect.Oracle10gDialect</
hibernate.dialect>
<jdbc.groupId>com.oracle</jdbc.groupId>
<jdbc.artifactId>ojdbc14</jdbc.artifactId>
<jdbc.version>10.2.0.2.0</jdbc.version>
<jdbc.driverClassName>oracle.jdbc.driver.OracleDriver</
jdbc.driverClassName>
Thanks. Mike
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]