在我正在开发的项目中,我遇到了一个不寻常的问题。关于网页上十几个文本区域输入字段的大小的要求并不清楚,因此,我发现自己不仅要更改数据库列以增加长度,还要更改指定的大小参数在我的文本区域组件的JSF验证器中。由于代码已经改变,因此需要紧急部署,这会让很多人发疯。不幸的是,没有人确定这些数据元素的长度应该是多少,我们希望它经常发生变化。我改变了我的varchars到clobs,但不幸的是clob尺寸也太小,也必须增加。 是否有任何工具或API可以帮助我解决这个问题?或者任何最佳做法?我正在考虑构建一个小的按需功能,它将生成所有数据库列长度,并通过单例类使其可用于应用程序。然后,UI视图将引用该特定元素,从而消除了代码部署的需要。
有没有人有更好的解决方案?
我使用的是JSF1.2 + EJB3 + Weblogic + Oracle数据库堆栈。
非常感谢您寻找。
答案 0 :(得分:0)
您的问题似乎是一个非常正常的用例的极端情况..(varchar to clob ... :))
您没有提到任何ORM框架,我假设您没有使用Hibernate。
我想到的第一个解决方案是使用JSR 303。它是一个非常可扩展的非侵入式验证框架。您可以在任何您想要的层中实现此框架。要将整个事物放在一起,您可以提供一个自定义约束validator,它将在内部有一种基于字段加载最大值和最小值的方法。想法是通过注释传递参数,指示字段名称,将每个字段名称的最小值 - 最大值存储在某个外部属性文件中。因此验证器将根据字段名称动态加载最小值。
因此,您有一个自定义框架,用于根据存储在属性文件中的约束来验证每个字段。您可以在演示文稿和DAO层中重复使用相同的约束。
当然,有一件事没有答案。
1.如何将此更改传播到基础数据库。您可以在数据库中提供最大可能的长度并处理应用程序层中的约束,但可能存在性能考虑因素。 (虽然,我怀疑会有.Oracle在其CBO中非常聪明)。
在这里查看一般example。
P.S:我自己从未尝试过这种定制,但这绝对是可能的。答案 1 :(得分: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文本列; “text”类型的列具有“无限”长度。
其次,character_maximum_length不考虑CHECK()约束。
create table foo (
bar varchar(50) check (length(bar) <= 35)
);
从information_schema.columns读取character_maximum_length的控件将允许50个字符,但数据库不允许您插入那么多字符。
您可能需要制定一些更多的管理和质量保证流程来降低风险。