oracle-databasemybatismybatis-generator

MyBatis Generator 1.3.7 generate entity for Oracle database 12c with wrong data type


I am using MyBatis Generator 1.3.7, Oracle database 12c (run by Docker https://hub.docker.com/r/sath89/oracle-12c/ ), JDK 10.0.2.

This is file generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <classPathEntry location="/Users/foo/Documents/mybatis/ojdbc7-12.1.0.1.jar"/>
    <context id="context1">
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>
        <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"/>
        <plugin type="org.mybatis.generator.plugins.RenameExampleClassPlugin">
            <property name="searchString" value="Example$"/>
            <property name="replaceString" value="Criteria"/>
        </plugin>
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <jdbcConnection connectionURL="jdbc:oracle:thin:dbuser/password@localhost:1521:xe" driverClass="oracle.jdbc.driver.OracleDriver">
        <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="com.example.repository" targetProject="src/main/resources"/>
        <javaClientGenerator targetPackage="com.example.repository" targetProject="src/main/java" type="XMLMAPPER"/>
        <table tableName="CCY"/>
    </context>
</generatorConfiguration>

My database schema

  CREATE TABLE "CCY" 
   (    "CURRENCY_ID" NUMBER(11,0), 
    "CURRENCY_NAME" NVARCHAR2(128), 
    "EXCHANGE_RATE" NUMBER(18,4), 
    "EXCHANGE_RATE_OPERATOR" NUMBER(1,0), 
    "IS_ACTIVE" NUMBER(1,0), 
    "CA_ACCOUNT" NVARCHAR2(32), 
    "BA_ACCOUNT" NVARCHAR2(32), 
    "PREFIX" NVARCHAR2(20), 
    "CCY_NAME" NVARCHAR2(128), 
    "DECIMAL_SEPERATE" NVARCHAR2(32), 
    "AFTER_DECIMAL" NVARCHAR2(20), 
    "SUBFIX" NVARCHAR2(20), 
    "CONVERT_RATE" NUMBER(18,4), 
    "PREFIX_ENG" NVARCHAR2(32), 
    "CCY_NAME_ENG" NVARCHAR2(32), 
    "DECIMAL_SEPERATE_ENG" NVARCHAR2(32), 
    "AFTER_DECIMAL_ENG" NVARCHAR2(32), 
    "SUBFIX_ENG" NVARCHAR2(32), 
    "CONVERT_RATE_ENG" NUMBER(18,4), 
    "PREFIX_DEFAULT" NVARCHAR2(20), 
    "CCY_NAME_DEFAULT" NVARCHAR2(20), 
    "DECIMAL_SEPERATE_DEFAULT" NVARCHAR2(32), 
    "AFTER_DECIMAL_DEFAULT" NVARCHAR2(32), 
    "SUBFIX_DEFAULT" NVARCHAR2(20), 
    "CONVERT_RATE_DEFAULT" NUMBER(18,4), 
    "PREFIX_DEFAULT_ENG" NVARCHAR2(32), 
    "CCY_NAME_DEFAULT_ENG" NVARCHAR2(32), 
    "DECIMAL_SEPERATE_DEFAULT_ENG" NVARCHAR2(32), 
    "AFTER_DECIMAL_DEFAULT_ENG" NVARCHAR2(32), 
    "SUBFIX_DEFAULT_ENG" NVARCHAR2(32), 
    "CONVERT_RATE_DEFAULT_ENG" NUMBER(18,4), 
    "EXAMPLE_AMOUNT" NUMBER(18,4), 
    "SORT_ORDER" NUMBER(*,0), 
    "VALUE_OF_MONEY" VARCHAR2(2048 BYTE), 
    "CREATED_DATE" TIMESTAMP (6) WITH TIME ZONE, 
    "CREATED_BY" NVARCHAR2(64), 
    "MODIFIED_DATE" TIMESTAMP (6) WITH TIME ZONE, 
    "MODIFIED_BY" NVARCHAR2(64)
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;

   COMMENT ON COLUMN "CCY"."CURRENCY_ID" IS 'Currency identity number';
REM INSERTING into CCY
SET DEFINE OFF;
Insert into CCY (CURRENCY_ID,CURRENCY_NAME,EXCHANGE_RATE,EXCHANGE_RATE_OPERATOR,IS_ACTIVE,CA_ACCOUNT,BA_ACCOUNT,PREFIX,CCY_NAME,DECIMAL_SEPERATE,AFTER_DECIMAL,SUBFIX,CONVERT_RATE,PREFIX_ENG,CCY_NAME_ENG,DECIMAL_SEPERATE_ENG,AFTER_DECIMAL_ENG,SUBFIX_ENG,CONVERT_RATE_ENG,PREFIX_DEFAULT,CCY_NAME_DEFAULT,DECIMAL_SEPERATE_DEFAULT,AFTER_DECIMAL_DEFAULT,SUBFIX_DEFAULT,CONVERT_RATE_DEFAULT,PREFIX_DEFAULT_ENG,CCY_NAME_DEFAULT_ENG,DECIMAL_SEPERATE_DEFAULT_ENG,AFTER_DECIMAL_DEFAULT_ENG,SUBFIX_DEFAULT_ENG,CONVERT_RATE_DEFAULT_ENG,EXAMPLE_AMOUNT,SORT_ORDER,VALUE_OF_MONEY,CREATED_DATE,CREATED_BY,MODIFIED_DATE,MODIFIED_BY) values ('91','LYD','16082,71','0','0','1112','1122',null,'Libyan Dinar',null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0','0','130',null,to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN',to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN');
Insert into CCY (CURRENCY_ID,CURRENCY_NAME,EXCHANGE_RATE,EXCHANGE_RATE_OPERATOR,IS_ACTIVE,CA_ACCOUNT,BA_ACCOUNT,PREFIX,CCY_NAME,DECIMAL_SEPERATE,AFTER_DECIMAL,SUBFIX,CONVERT_RATE,PREFIX_ENG,CCY_NAME_ENG,DECIMAL_SEPERATE_ENG,AFTER_DECIMAL_ENG,SUBFIX_ENG,CONVERT_RATE_ENG,PREFIX_DEFAULT,CCY_NAME_DEFAULT,DECIMAL_SEPERATE_DEFAULT,AFTER_DECIMAL_DEFAULT,SUBFIX_DEFAULT,CONVERT_RATE_DEFAULT,PREFIX_DEFAULT_ENG,CCY_NAME_DEFAULT_ENG,DECIMAL_SEPERATE_DEFAULT_ENG,AFTER_DECIMAL_DEFAULT_ENG,SUBFIX_DEFAULT_ENG,CONVERT_RATE_DEFAULT_ENG,EXAMPLE_AMOUNT,SORT_ORDER,VALUE_OF_MONEY,CREATED_DATE,CREATED_BY,MODIFIED_DATE,MODIFIED_BY) values ('92','MAD','2254,55','0','0','1112','1122',null,'Moroccan Dirham',null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0',null,null,null,null,null,'0','0','134',null,to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN',to_timestamp_tz('14-02-2018 18:00:41,370000000 ASIA/HO_CHI_MINH','DD-MM-RRRR HH24:MI:SSXFF TZR'),'ADMIN');

I run command

java -jar /Users/foo/Documents/mybatis/mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite

and the result is

package com.example.model;

import java.io.Serializable;
import java.math.BigDecimal;

public class Ccy implements Serializable {
    private Long currencyId;
    private Object currencyName;
    private BigDecimal exchangeRate;
    private Short exchangeRateOperator;
    private Short isActive;
    private Object caAccount;
    private Object baAccount;
    private Object prefix;
    private Object ccyName;
    private Object decimalSeperate;
    private Object afterDecimal;
    private Object subfix;
    private BigDecimal convertRate;
    private Object prefixEng;
    private Object ccyNameEng;
    private Object decimalSeperateEng;
    private Object afterDecimalEng;
    private Object subfixEng;
    private BigDecimal convertRateEng;
    private Object prefixDefault;
    private Object ccyNameDefault;
    private Object decimalSeperateDefault;
    private Object afterDecimalDefault;
    private Object subfixDefault;
    private BigDecimal convertRateDefault;
    private Object prefixDefaultEng;
    private Object ccyNameDefaultEng;
    private Object decimalSeperateDefaultEng;
    private Object afterDecimalDefaultEng;
    private Object subfixDefaultEng;
    private BigDecimal convertRateDefaultEng;
    private BigDecimal exampleAmount;
    private BigDecimal sortOrder;
    private String valueOfMoney;
    private Object createdDate;
    private Object createdBy;
    private Object modifiedDate;
    private Object modifiedBy;

    private static final long serialVersionUID = 1L;

    public Long getCurrencyId() {
        return currencyId;
    }

    public void setCurrencyId(Long currencyId) {
        this.currencyId = currencyId;
    }

    //... more getter, setter...

I expected

private Object currencyName;

become to

private String currencyName;

because this filed has datatype NVARCHAR2(128), and other fields are the same. How to fix it?


Solution

  • Mybatis generator doesn't know about type NVARCHAR2 it only knows NVARCHAR type.

    You can create your own JavaTypeResolver which can extend default JavaTypeResolverDefaultImpl and add additional types to typeMap.