-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: @org.hibernate.annotations.Table references an unknown table
PostPosted: Fri Nov 06, 2009 11:28 am 
Newbie

Joined: Fri Nov 06, 2009 10:26 am
Posts: 2
We are attempting to setup a multi-column index.

This is how our code looked before setting up index. Everything works fine and we have used it for months.
@javax.persistence.Entity
@javax.persistence.Table(name="PERSONNEL_VERSION")

public class PPersonnelVersion extends PVersion {

**************************************************
This is code trying to create the index. It fails with the exception in the subject line...

import org.hibernate.annotations.Index;

@javax.persistence.Entity
@javax.persistence.Table(name="PERSONNEL_VERSION")
@org.hibernate.annotations.Table(appliesTo = "PERSONNEL_VERSION",
indexes = { @Index(name = "personnelSSN", columnNames = { "id", "effective_date", "expiration_date", "Social_Security_Number" }) })

public class PPersonnelVersion extends PVersion {
**************************************************
We are currently using the following Naming Strategy. I did not create it but I believe it to be based on one by Gavin. If we remove the naming strategy we are able to create tables with indexes. Any idea why this Naming Strategy would cause a problem?

/**
* An improved naming strategy that prefers embedded
* underscores to mixed case names
* @see DefaultNamingStrategy the default strategy
* @author Gavin King
*/
public class APSNamingStrategy implements NamingStrategy, Serializable {

/**
* A convenient singleton instance
*/
public static final NamingStrategy INSTANCE = new APSNamingStrategy();

/**
* Return the unqualified class name, mixed case converted to
* underscores
*/
public String classToTableName(String className) {
return addUnderscores( StringHelper.unqualify(className) ).substring(1);//ignore first character, which is P for APS
}
/**
* Return the full property path with underscore seperators, mixed
* case converted to underscores
*/
public String propertyToColumnName(String propertyName) {
return addUnderscores( StringHelper.unqualify(propertyName) );
}
/**
* Convert mixed case to underscores
*/
public String tableName(String tableName) {
return addUnderscores(tableName);
}
/**
* Convert mixed case to underscores
*/
public String columnName(String columnName) {
return addUnderscores(columnName);
}

protected static String addUnderscores(String name) {
StringBuffer buf = new StringBuffer( name.replace('.', '_') );
for (int i=1; i<buf.length()-1; i++) {
if (
Character.isLowerCase( buf.charAt(i-1) ) &&
Character.isUpperCase( buf.charAt(i) ) &&
Character.isLowerCase( buf.charAt(i+1) )
) {
buf.insert(i++, '_');
}
}
return buf.toString().toLowerCase();
}

public String collectionTableName(
String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
String propertyName
) {
return tableName( ownerEntityTable + '_' + propertyToColumnName(propertyName) );
}

/**
* Return the argument
*/
public String joinKeyColumnName(String joinedColumn, String joinedTable) {
return columnName( joinedColumn );
}

/**
* Return the property name or propertyTableName
*/
public String foreignKeyColumnName(
String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
) {
String header = propertyName != null ? StringHelper.unqualify( propertyName ) : propertyTableName;
if (header == null) throw new AssertionFailure("NamingStrategy not properly filled");
return columnName( header ); //+ "_" + referencedColumnName not used for backward compatibility
}

/**
* Return the column name or the unqualified property name
*/
public String logicalColumnName(String columnName, String propertyName) {
return StringHelper.isNotEmpty( columnName ) ? columnName : StringHelper.unqualify( propertyName );
}

/**
* Returns either the table name if explicit or
* if there is an associated table, the concatenation of owner entity table and associated table
* otherwise the concatenation of owner entity table and the unqualified property name
*/
public String logicalCollectionTableName(String tableName,
String ownerEntityTable, String associatedEntityTable, String propertyName
) {
if ( tableName != null ) {
return tableName;
}
else {
//use of a stringbuffer to workaround a JDK bug
return new StringBuffer(ownerEntityTable).append("_")
.append(
associatedEntityTable != null ?
associatedEntityTable :
StringHelper.unqualify( propertyName )
).toString();
}
}
/**
* Return the column name if explicit or the concatenation of the property name and the referenced column
*/
public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
return StringHelper.isNotEmpty( columnName ) ?
columnName :
StringHelper.unqualify( propertyName ) + "_" + referencedColumn;
}


Thanks

Brian


Top
 Profile  
 
 Post subject: Re: @org.hibernate.annotations.Table references an unknown table
PostPosted: Fri Nov 06, 2009 12:47 pm 
Newbie

Joined: Fri Nov 06, 2009 10:26 am
Posts: 2
Ok it looks like the problem is that in EntityBinder.java the code that is looking for the appliedTable name in the collection of tables is case sensitive.
Code:
   public void processComplementaryTableDefinitions(org.hibernate.annotations.Table table) {
      //comment and index are processed here
      if ( table == null ) return;
      String appliedTable = table.appliesTo();
      Iterator tables = persistentClass.getTableClosureIterator();
      Table hibTable = null;
      while ( tables.hasNext() ) {
         Table pcTable = (Table) tables.next();


         if ( pcTable.getQuotedName().equals( appliedTable ) ) {
            //we are in the correct table to find columns
            hibTable = pcTable;
            break;
         }


Our naming strategy was returning a lower case table name. This did not cause a problem for us, except when we were trying to do the indexes. We changed out code to be consistent in regards to case.

Thanks

Brian


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.