我的数据库视图有一列唯一标识视图中的每一行。即使视图的定义(DDL)中没有主键,该列也可以用作主键,因为它是一个视图。
OpenJPA拒绝将视图映射到Java POJO,因为没有主键。
我有一个视图列表和主键,我有一个ReverseCustomizer。是否有可能我可以给OpenJPA列/字段作为每个视图/类的主键/ id?
目前,反向映射工具为每个视图调用unmappedTable
,我想告诉反向映射器使用我提供的主键进行映射。
答案 0 :(得分:1)
这可以帮助您入门。
public class MyDBReverseCustomizer implements ReverseCustomizer {
private ReverseMappingTool rmt;
@Override
public void setTool(ReverseMappingTool rmt) {
this.rmt = rmt;
}
@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);
}
customize(field);
}
//cls.setPrimaryKeyColumns(new Column[]{pk});
cls.setObjectIdType(null, false);
cls.setIdentityType(ClassMapping.ID_DATASTORE);
cls.setStrategy(new FullClassStrategy(), null);
return true;
}
...
}