2013-11-21 32 views
2

我有数据库视图有一个唯一标识视图中的每一行的列。即使视图在其定义(DDL)中没有主键,因为它是一个视图,该列仍可用作主键。OpenJPA可以用来反转映射数据库视图吗?

由于没有主键,OpenJPA拒绝将视图映射到Java POJO。

我有一个视图和主键列表,我有一个ReverseCustomizer。是否有可能我可以让OpenJPA将column/field用作每个视图/类的主键/ id?

目前,反向映射工具为每个视图调用unmappedTable,我想告诉反向映射器使用我提供的主键进行映射。

回答

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; 
    } 

    ... 

} 
相关问题