一.继承覆盖MetaBuilder类,创建新ViewMetaBuilder
package generator;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.activerecord.generator.MetaBuilder;
import com.jfinal.plugin.activerecord.generator.TableMeta;
public class ViewMetaBuilder extends MetaBuilder{
	public ViewMetaBuilder(DataSource dataSource) {
		super(dataSource);
	}
	
	protected void buildPrimaryKey(TableMeta tableMeta) throws SQLException {
		ResultSet rs = dbMeta.getPrimaryKeys(conn.getCatalog(), null, tableMeta.name);
		
		String primaryKey = "";
		int index = 0;
		while (rs.next()) {
			if (index++ > 0) {
				primaryKey += ",";
			}
			primaryKey += rs.getString("COLUMN_NAME");
		}
	/*	if (StrKit.isBlank(primaryKey)) {
			throw new RuntimeException("primaryKey of table \"" + tableMeta.name + "\" required by active record pattern");
		}*/
		tableMeta.primaryKey = primaryKey;
		rs.close();
	}
	
	protected ResultSet getTablesResultSet() throws SQLException {
		String schemaPattern = dialect instanceof OracleDialect ? dbMeta.getUserName() : null;
		 return dbMeta.getTables(conn.getCatalog(), schemaPattern, null, new String[]{"TABLE", "VIEW"});
//		return dbMeta.getTables(conn.getCatalog(), schemaPattern, null, new String[]{"TABLE"});	// 不支持 view 生成
	}
	
        // 覆盖此方法,在JFinal3.4可以不用覆盖,JFinal3.5需要覆盖此方法
	protected void removeNoPrimaryKeyTable(List<TableMeta> ret) {
		for (java.util.Iterator<TableMeta> it = ret.iterator(); it.hasNext();) {
			TableMeta tm = it.next();
			if (StrKit.isBlank(tm.primaryKey)) {
				//it.remove();//注释这个代码,不然没有主键的表格不会生成
				System.err.println("Skip table " + tm.name + " because there is no primary key");
			}
		}
	}
}二.拷贝重新编辑生成_MappingKit模板文件
将生成_MappingKit文件的模板文件拷贝出来,添加判断主键为空(为视图或者为不设主键的表格),不添加主键映射;不为空就添加主键映射。
模板文件存在于Jfinal3.4的核心jar文件中,如截图:

拷贝并做修改:
package #(mappingKitPackageName);
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
/**
 * Generated by JFinal, do not modify this file.
 * <pre>
 * Example:
 * public void configPlugin(Plugins me) {
 *     ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
 *     #(mappingKitClassName).mapping(arp);
 *     me.add(arp);
 * }
 * </pre>
 */
public class #(mappingKitClassName) {
	
	public static void mapping(ActiveRecordPlugin arp) {
	#for (tableMeta : tableMetas)
		#if (tableMeta.primaryKey.contains(","))
		// Composite Primary Key order: #(tableMeta.primaryKey)
		#end
		#if(tableMeta.primaryKey=='') 
		        ###修改这儿,添加主键为空判断
			arp.addMapping("#(tableMeta.name)", #(tableMeta.modelName).class);
		#else
			arp.addMapping("#(tableMeta.name)", "#(tableMeta.primaryKey)", #(tableMeta.modelName).class);
		#end
	#end
	}
}三.将以上两个文件添加到GeneratorDemo类中
Generator generator = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir);
generator.setMetaBuilder(new ViewMetaBuilder(getDataSource()));
generator.setMappingKitTemplate("/generator/mapping_kit_tempate.jf");//模板文件保存路径四.执行GeneratorDemo类,生成View和table混合的_MappingKit映射文件

 
 
 
 
 
 
