2011-04-16 106 views
1

我在開發一個項目時遇到了一個不尋常的問題。關於網頁上十幾個文本區域輸入字段的大小的要求並不清楚,因此,我發現自己不僅需要更改數據庫列以增加長度,還要更改指定的大小參數在我的文本區域組件的JSF驗證程序中。由於代碼已經改變,所以需要進行緊急部署,這讓很多人感到憤怒。不幸的是,沒有人確定這些數據元素應該是多長,我們期望它經常變化。我把我的變種變成了clobs,但不幸的是clob的大小也太小了,不得不增加。 有沒有任何工具或API可以幫助我解決這個問題?或者任何最佳實踐?我正在考慮構建一個小的隨需應變功能,該功能將生成所有db列長度並通過單例類提供給應用程序。然後,UI視圖將引用該特定元素,從而消除對代碼部署的需求。UI上的即時數據庫字段長度驗證

有沒有人有更好的解決方案?

我正在使用JSF1.2 + EJB3 + Weblogic + Oracle數據庫堆棧。

非常感謝您的關注。

回答

0

您的問題似乎是一個非常正常的使用案例..的極端情況下(VARCHAR到CLOB ... :))

您還沒有提到任何ORM框架,我認爲你不使用Hibernate。

我想到的第一個解決方案是使用JSR 303。它是一個非常可擴展的非侵入式驗證框架。你可以在任何你想要的層中實現這個框架。要將所有東西放在一起,您可以提供一個自定義約束validator,這將在內部根據字段加載最大值和最小值。這個想法是通過註釋傳遞一個參數,指出字段名稱,在某個外部屬性文件中存儲每個字段名稱的最小 - 最大值。所以驗證器將根據字段名稱動態加載最小值最大值。

因此,您有一個自定義框架,用於根據存儲在屬性文件中的約束驗證每個字段。您可以在演示文稿和DAO圖層中重複使用相同的約束。

當然,有一件事是沒有答案的。

1.如何將此更改傳播到底層數據庫。您可以在數據庫中提供最大可能的長度並處理應用程序層中的限制,但可能會考慮性能。 (儘管我懷疑會有這樣的情況,甲骨文在其CBO中非常聰明)。

這裏尋找一般的example

P.S:我從來沒有嘗試過這種定製,但它絕對有可能。

0

聽起來就像您想要構建在運行時讀取數據庫元數據的驗證代碼。重點是避免重新部署代碼。

第一部分不太難。第二部分有點冒險。

列的最大長度至少出現在一些information_schema視圖中。

select table_catalog, table_schema, table_name, 
     column_name, data_type, character_maximum_length 
from information_schema.columns 
where table_name = 'your-table-name' 
order by table_catalog, table_schema, table_name, column_name 

但是某些字符數據類型可能沒有character_maximum_length的值。 PostgreSQL文本列,例如; 「文本」類型的列具有「無限」長度。

其次,character_maximum_length不考慮CHECK()約束。

create table foo (
    bar varchar(50) check (length(bar) <= 35) 
); 

從INFORMATION_SCHEMA.COLUMNS閱讀CHARACTER_MAXIMUM_LENGTH將允許50個字符的控制,但數據庫不會讓你插入很多。

您可能需要增加一些管理和QA流程以降低風險。

+0

感謝您的意見。我使用oracle 9 db,因此我使用以下查詢來生成表列長度,我寫入文件以供在表示層上用於驗證。 'code'從all_tab_columns中選擇table_name,column_name,data_length,其中table_name IN(SELECT table_name FROM dba_tables t where owner =?1)和data_type IN('VARCHAR2','CLOB')group by table_name,column_name,data_length order by table_name'code ' – Jaizen 2011-04-20 16:27:30

+0

@Jaizen:ALL_TAB_COLUMNS.DATA_LENGTH沒有列出CLOB的最大長度。相反,該數字表示可能用於將數據存儲在同一行中的空間量。通常這個數字是4000.一個CLOB的實際最大大小至少是幾兆字節。 – 2011-04-21 02:59:11