Hi Fay Wang,
thanks for your reply. As you probably already guessed beacuse of the name
"jdo_keygen", we are
porting an application that was based on JDO to JPA. So the table already
exists and we must not
generate it. As the table already exists with a column "table_name" this name
is valid as a
column name for these databases (we tested with MS SQL Server and MySQL, both
failed for the
same reason).
Can't I tell JPA to take the pkColumnName as is when accessing the database
table?
Can we influence what's assumed a valid column name?
Is there any other opportunity to come around this problem. I thought about
dropping the whole
@GeneratedValue thing and doing the key generating on my own. How do you think
about that idea?
kind regards,
Michael
Fay Wang schrieb:
> Hi,
> I used your annotation and my test case runs fine.
> Given your pkColumnName = "table_name", openjpa internally makes this
> column name valid for a given database. This code is in ValueTableJDBCSeq:
>
> protected Column addPrimaryKeyColumn(Table table) {
> DBDictionary dict = getConfiguration().getDBDictionaryInstance();
> Column pkColumn = table.addColumn(dict.getValidColumnName
> (getPrimaryKeyColumn(), table));
> ...
>
> }
>
> Note that the return value from dict.getValidColumnName is table_name0.
>
> From my jdbc log, the table jdo_keygen is created as:
>
> CREATE TABLE jdo_keygen (TABLE_NAME0 VARCHAR(254) NOT NULL, LAST_USED_ID
> BIGINT, PRIMARY KEY (TABLE_NAME0))
>
> As a result, there is no problem executing
>
> SELECT LAST_USED_ID FROM jdo_keygen WHERE TABLE_NAME0 = ? FOR UPDATE
>
> I am using openjpa trunk for this exercise. You might want to turn on jdbc
> log to see how create jdo_keygen is created.
>
> Hope this helps.
> Fay
>
>
>
> ----- Original Message ----
> From: Michael Simons <[email protected]>
> To: [email protected]
> Sent: Monday, June 22, 2009 6:48:17 AM
> Subject: Problem with @TableGenerator [OpenJPA 1.2.2]
>
> Hello,
>
> Here's my annotation:
> @TableGenerator(name = "pkGenSessionConfig", table = "jdo_keygen",
> pkColumnName =
> "table_name", valueColumnName = "last_used_id", pkColumnValue =
> "session_config", allocationSize
> = 10)
> @Id
> @GeneratedValue(strategy=GenerationType.TABLE,
> generator="pkGenSessionConfig")
> @Column(name="session_config_id", unique=true, nullable=false)
> private int id;
>
> And here's the according SQL generated by OpenJPA:
> Unknown column 'TABLE_NAME0' in 'where clause' {prepstmnt 32845046 SELECT
> LAST_USED_ID FROM
> jdo_keygen WHERE TABLE_NAME0 = ? FOR UPDATE [params=(String) session_config]}
> [code=1054,
> state=42S22]
>
> Question: Where does OpenJPA take "TABLE_NAME0" from while
> pkColumnValue="table_name"
>
> Kind Regards,
> Michael
>
>
>
>
>