1 回答

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