【问题标题】:Can OpenJPA be used to reverse map a database view?OpenJPA 可以用于反向映射数据库视图吗?
【发布时间】:2023-09-27 12:59:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: openjpa


    【解决方案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;
        }
    
        ...
    
    }
    

    【讨论】: