[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4553?page=c...
]
Steve Ebersole commented on HHH-4553:
-------------------------------------
Apparently the final yet-to-be-release adds a very troubling footnote that effects how
quoting occurs in the case where both approaches intersect. According to the footnote,
@Table(name="\"test\"") + <delimited-identifier/> should lead to
the actual name being name="\"\"test\"\"". We do not
support that as of yet. Essentially the footnote makes this an additive situation, while
my code treats it as either or. For the time being I will leave this as-is.
I ended up sometimes applying the "name normalization" code multiple times,
which could be very bad with this new additive rule: "test" ->
""test"" -> """test""" -> ...
If we do need to end up fixing this (as of now I only plan on doing this if the TCK
explicitly tests for it) I want this handled via the
org.hibernate.cfg.Environment#JPAQL_STRICT_COMPLIANCE switch as I'd prefer this
"additive approach" to not be the default behavior.
Hibernate doesn't support official JPA2 escape char for table
name
------------------------------------------------------------------
Key: HHH-4553
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-4553
Project: Hibernate Core
Issue Type: Sub-task
Affects Versions: 3.5.0-Beta-2
Environment: Oracle 9i
Derby
Reporter: Julien HENRY
Assignee: Steve Ebersole
Fix For: 3.5
Time Spent: 6 hours, 35 minutes
Remaining Estimate: 0 minutes
One of the table of my schema is named FUNCTION. As it is a reserved name with Derby
(used for my JUnit tests), I have escaped the table name to make it works with Derby (as
specified by JPA2 spec $2.13):
@Entity
@Table(name="\"FUNCTION\"")
public class Function {
//...
}
My JUnit tests are working fine, then I tried to connect to my Oracle DB, and I have
enabled schema validation:
<property name="hibernate.hbm2ddl.auto" value="validate"/>
But I got an exception as Hibernate is looking for a table with name "FUNCTION"
in Oracle metadata.
Caused by: org.hibernate.HibernateException: Missing table: "FUNCTION"
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1153)
[hibernate-core-3.5.0-Beta-2.jar:3.5.0-Beta-2]
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:139)
[hibernate-core-3.5.0-Beta-2.jar:3.5.0-Beta-2]
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:364)
[hibernate-core-3.5.0-Beta-2.jar:3.5.0-Beta-2]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1367)
[hibernate-core-3.5.0-Beta-2.jar:3.5.0-Beta-2]
at
org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:858)
[hibernate-annotations-3.5.0-Beta-2.jar:3.5.0-Beta-2]
at
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:733)
[hibernate-entitymanager-3.5.0-Beta-2.jar:3.5.0-Beta-2]
This is not specific to Oracle, because when I change:
<property name="hibernate.hbm2ddl.auto" value="create"/>
by
<property name="hibernate.hbm2ddl.auto" value="validate"/>
in my JUnit tests, I have the same issue with the embedded Derby DB.
Using Hibernate specific ` as quote works fine:
@Entity
@Table(name="`FUNCTION`")
public class Function {
//...
}
The issue can be easily fixed in Table.setName(String name). Replace:
if ( name.charAt( 0 ) == '`' ) {
by
if ( name.charAt( 0 ) == '"' ) {
or if you want to keep backward compatibility:
if ( name.charAt( 0 ) == '`' || name.charAt( 0 ) == '"' ) {
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira