OpenJPA可以用于反向映射数据库视图吗?

时间:2013-11-21 17:07:10

标签: openjpa

我的数据库视图有一列唯一标识视图中的每一行。即使视图的定义(DDL)中没有主键,该列也可以用作主键,因为它是一个视图。

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

我有一个视图列表和主键,我有一个ReverseCustomizer。是否有可能我可以给OpenJPA列/字段作为每个视图/类的主键/ id?

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

1 个答案:

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

    ...

}