我正在开发一个项目,遇到了一个不寻常的问题。关于web页面上的十几个文本区域输入字段的大小,需求并不明确,因此,我发现自己不仅必须更改数据库列以增加长度,还必须更改JSF验证器中为该文本区域组件指定的大小参数。由于代码发生了变化,紧急部署是必要的,这让很多人很恼火。不幸的是,没有人确切地知道这些数据元素的长度应该是多少,我们预计它会经常变化。我把我的varchars改成了clob,但不幸的是clob的尺寸也太小了,不得不增加。有什么工具或api可以帮助我解决这个问题吗?或者有最佳实践吗?我正在考虑构建一个小的、随需应变的特性,它将生成所有db列长度,并通过单例类将其提供给应用程序。然后UI视图将引用该特定元素,从而消除了对代码部署的需要。
谁有更好的解决方案?
我使用JSF1.2+EJB3+Weblogic+Oracle DB堆栈。
你的问题似乎是一个非常正常的用例的极端情况。(varchar to clob…:))
您没有提到任何ORM框架,我假设您没有使用Hibernate。
我想到的第一个解决方案是使用JSR 303。它是一个可伸缩的、非侵入性的验证框架。您可以在您想要的任何层实现这个框架。为了将所有这些结合在一起,您可以提供一个自定义约束验证器,它将在内部提供一种基于字段加载最大值和最小值的方法。其思想是通过注释传递一个参数,指示字段名,将每个字段名的最小最大值存储在一些外部属性文件中。因此,验证器将根据字段名动态加载最小最大值。
因此,您有一个定制的框架,用于根据存储在属性文件中的约束验证每个字段。您可以在表示层和DAO层中重用相同的约束。
当然,有一件事没有答案。
1。如何将此更改传播到底层数据库。您可以在数据库中提供最大可能的长度,并在应用程序层中提供句柄约束,但可能要考虑性能问题。(虽然,我怀疑会有。Oracle的CBO非常非常聪明。
看这里有一个通用的例子。
p。S:我自己从来没有尝试过这种定制,但这绝对是可能的。
听起来您想要构建在运行时读取数据库元数据的验证代码。关键是要避免重新部署代码。
第一部分并不太难。第二部分有点冒险。
列的最大长度至少出现在某些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中读取character_maximum_length的控件。列允许插入50个字符,但是数据库不允许插入那么多。
你可能需要更多的管理和QA流程来降低风险。