1 回答

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個贊
對于這樣的問題顯然沒有絕對的是/否答案,但是有幾種解決方案/解決方法:
使用之前的數(shù)據(jù)庫產(chǎn)品生成代碼
這將在短時間內(nèi)起作用,例如現(xiàn)在,但隨著您繼續(xù)前進(jìn),它將成為您的模式設(shè)計(jì)的一個極其有限的因素。您將繼續(xù)圍繞 HSQLDB 的功能定制您的 DDL 和其他一些設(shè)計(jì)決策,并且您將無法利用新數(shù)據(jù)庫產(chǎn)品的其他功能。這在遷移數(shù)據(jù)時尤其受限,因?yàn)锳LTER TABLE方言之間的陳述大不相同。
我只會在很短的時間內(nèi)推薦這種方法,例如,如果您不能立即徹底解決這個問題。
使用 jOOQ 的<forcedType/>機(jī)制來重寫你的數(shù)據(jù)類型
jOOQ 的代碼生成器允許在將模式的元數(shù)據(jù)加載到代碼生成器之前重寫數(shù)據(jù)類型。這樣,即使您的新數(shù)據(jù)庫產(chǎn)品不byte支持.TINYINTTINYINT
這是一個徹底的解決方案,無論您使用的是什么產(chǎn)品,您都可能希望實(shí)施它,因?yàn)樗鼤槟峁┮环N方法來重新定義部分架構(gòu),僅適用于 jOOQ 的代碼生成器,而與您生成代碼的方式無關(guān).
該功能記錄在此處: https: //www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-database/codegen-database-forced-types
對于您的情況,這絕對是一個更長期的解決方案。
請注意,未來的 jOOQ 將能夠使用CHECK約束作為輸入元數(shù)據(jù)來決定是否應(yīng)用這樣的<forcedType/>. 我想你會CHECK (my_smallint BETWEEN -128 AND 127)在每個這樣的列上放置一個約束,所以你可以很容易地識別哪些列適用于<forcedType/>:https://github.com/jOOQ/jOOQ/issues/8843
在該功能可用之前,您可以通過編程代碼生成器配置自己實(shí)現(xiàn)它: https: //www.jooq.org/doc/latest/manual/code-generation/codegen-programmatic/
或者,從 jOOQ 3.12 開始,通過使用 SQL 表達(dá)式來生成匹配的正則表達(dá)式<forcedType/>。例如在 Oracle 中:
<forcedType>
<name>TINYINT</name>
<sql>
select listagg(owner || '.' || table_name || '.'
|| regexp_replace(search_condition_vc, ' between.*', ''), '|')
from user_constraints
where constraint_type = 'C'
and regexp_like(search_condition_vc, '.* between -128 and 127');
</sql>
</forcedType>
您可以使用基于文件的元數(shù)據(jù)源
jOOQ 不必連接到實(shí)時數(shù)據(jù)庫實(shí)例即可對您的模式進(jìn)行逆向工程。您還可以將 DDL 代碼傳遞給 jOOQ 或 XML 文件:
https://www.jooq.org/doc/latest/manual/code-generation/codegen-ddl/
https://www.jooq.org/doc/latest/manual/code-generation/codegen-xml/
這并不能真正直接解決您的問題,但也許可以使解決起來更容易一些。但是,這些方法還有其他限制,例如,當(dāng)前(jOOQ 3.12)不支持存儲過程,所以我只是為了完整起見在這里添加它,而不是建議您現(xiàn)在使用它。
添加回答
舉報