Okay... I got past that exception and pasted my code below.
I now have reverse mapped the views... I only hope this works when it comes
time to retrieve and save objects from/to the database. X=
@Override
public boolean unmappedTable(Table table) {
// this method is called to give this class an opportunity to map
the
// table which would not be mapped otherwise. Returning false says
// the table wasn't mapped here.
//Class klass = rmt.generateClass(table.getIdentifier().getName(),
null);
String packageName = rmt.getPackageName();
String tableName = table.getIdentifier().getName();
String className = NameConverters.convertTableName(tableName);
Class klass = rmt.generateClass(packageName+"."+className, null);
ClassMapping cls = rmt.newClassMapping(klass, table);
Column pk = null;
for ( Column column : table.getColumns() ) {
String columnName = column.getIdentifier().getName();
String fieldName = rmt.getFieldName(columnName, cls);
Class type = rmt.getFieldType(column, false);
FieldMapping field = cls.addDeclaredFieldMapping(fieldName,
type);
field.setExplicit(true);
field.setColumns(new Column[]{column});
// TODO: set the appropriate strategy for non-primitive types.
field.setStrategy(new PrimitiveFieldStrategy(), null);
if ("MODEL_VIEW".equals(tableName) &&
"MODEL_ID".equals(columnName)) {
pk = column;
field.setPrimaryKey(true);
}
}
//cls.setPrimaryKeyColumns(new Column[]{pk});
cls.setObjectIdType(null, false);
cls.setIdentityType(ClassMapping.ID_DATASTORE);
cls.setStrategy(new FullClassStrategy(), null);
return true;
}
--
Jason Zwolak
On Thu, Nov 21, 2013 at 9:39 AM, Jason Zwolak <[email protected]> wrote:
> Since database views don't have keys, openjpa's reverse mapping tool
> doesn't map them by default.
>
> The views I'm using have a column that is unique for every row in the view
> and I'd like to use it as the @Id in the generated POJOs. Can I somehow
> give OpenJPA the column to use in each view so that a reverse map can be
> made?
>
> I have a ReverseCustomizer class that I tried to use to do this and all
> the views got sent to unmappedTable. I could also create a custom
> DBDictionary if that would help.
>
> If using the ReverseCustomizer is the way to go, then some more
> information about how to perform the map in the unmappedTable method would
> be useful. The JavaDocs say this:
>
> Notification that a table has gone unmapped. You can map the table
>> yourself using this method. When mapping, use
>> ReverseMappingTool.generateClass(java.lang.String, java.lang.Class) to
>> create the class,ReverseMappingTool.newClassMapping(java.lang.Class,
>> org.apache.openjpa.jdbc.schema.Table) to create the class metadata, and
>> then ClassMapping.addDeclaredFieldMapping(java.lang.String,
>> java.lang.Class) to add field metadata.
>
>
> And I wrote some code and got this exception:
>
> Exception in thread "main" <openjpa-2.4.0-SNAPSHOT-r422266:1539200M fatal
> user error> org.apache.openjpa.util.MetaDataException: No table was given
> for persistent type "MODEL_VIEW".
>
>
> Here's my code (for testing I'm only mapping a single view and this code
> is for that view):
> @Override
>
> public boolean unmappedTable(Table table) {
>
> Class klass = rmt.generateClass(table.getIdentifier().getName(),
> null);
>
> ClassMapping cm = rmt.newClassMapping(klass, table);
>
> Column pk = null;
>
> for ( Column column : table.getColumns() ) {
>
> String name = column.getIdentifier().getName();
>
> if ("MODEL_ID".equals(name)) {
>
> pk = column;
>
> }
>
> // this is a hack just to get the code running...
> // later I'll replace it with the appropriate type on a per
> column basis
> cm.addDeclaredFieldMapping(name, Integer.class);
>
> }
>
> cm.setPrimaryKeyColumns(new Column[]{pk});
>
> return true;
>
> }
>
> I'm calling the reverse mapping tool with:
>
> java -classpath $CLASSPATH \
>
> org.apache.openjpa.jdbc.meta.ReverseMappingTool \
>
> -pkg com.mybiz.generated.entities -d src \
>
> build/schema.xml -annotations true -metadata none \
>
> -cc com.mybiz.MyReverseCustomizer
>
>
> And schema.xml looks like (I removed all columns except the two seen here
> for brevity):
>
> <?xml version="1.0" encoding="UTF-8"?>
>
> <schemas>
>
> <schema name="MY_SCHEMA">
>
> <table name="MODEL_VIEW">
>
> <column name="MODEL_ID" type="decimal" type-name="NUMBER"
> not-null="true" size="22"/>
>
> <column name="MODEL_DESCRIPTION" type="varchar"
> type-name="VARCHAR2" not-null="true" size="240"/>
>
> </table>
>
> </schema>
>
> </schemas>
>
> Thanks for any help!!
> --
> Jason Zwolak
>