2013-11-21 30 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; 
    } 

    ... 

} 
相關問題