7

技术: - Java 1.5 或 1.6 - Hibernate 3.4

为了避免在更改列名或表名时在多个位置更新列名,我希望有一个相同的常量文件。

我有以下疑问?

  • 一种可能的解决方案是维护一个全局文件,该文件存储数据库中所有表的列名的常量。像

    class DbConstants
    {
            public static final String EMPLOYEE__PERFORMANCE_DESC="performance_desc";        
    } 
    

在上述情况下,employees 是表名,performance_desc 是列名。因此,如果两个不同的表都有列名,则遵循 tablename__columnname 格式来命名常量以避免两个不同表的两个常量之间的冲突。

我看到这种方法的一个问题是,随着数据库的增长,这个文件中的常量不会增长到数千个,这很难管理。其他问题是如果表名被更改,我必须更改所有表的前缀表名。

  • 假设如果我将上面示例中的列名从 performance_desc 更改为成就_desc。在这种情况下,我很可能也想更改常量,即从 EMPLOYEE__PERFORMANCE_DESC 更改为 EMPLOYEE__ACHIEVEMENT_DESC。因为在这种情况下,我需要同时更改列名和常量名,所以我看不到直接在我的代码中使用常量而不是列名,尽管有一个好处是在更改常量名时我可以使用折射来反映常量名称更改任何引用的地方。似乎没有太多使用常量,或者我使用错误的方式。

  • 在项目代码中,我似乎有人为每个表列列表定义一个类来定义常量,如下所示。

    public class tbl_Employee
    {
            public static final PERFORMANCE_DESC=performance_desc;
    }    
    

这可以解决全局文件的一些问题,例如表名更改只会导致类名更改。一个主要问题是我使用类的唯一目的是定义常量,这不是好的编码习惯。

  • 阅读一些关于 Enum 与 value string 而不是 int 的地方,不确定它在 java 1.5 或 1.6 中是否可用,以及是否建议在给定场景中使用它。

  • 给定定义数据库常量的最佳实践是什么?

  • 使用 db 常量真的有用吗?

  • 如果我像上面提到的那样为每个表使用一个类,我面临的一个问题是命名约定。表名与定义表列常量的相应类名之间应该有什么关系。

  • 上述情况仅涵盖列名而不是表名的情况。我可能喜欢在代码中使用常量而不是表名,所以应该用什么方法来定义表名的常量。

  • 人们经常争辩说,一旦产品或相关版本发布,表名和列名并没有太大变化。表名和列名的更改主要发生在开发阶段或功能增强(新版本)。避免对表名或列名使用常量是否是强有力的论据?

    请建议我怎样才能让我的问题更具代表性,或者我错过了什么我的问题没有被投票?

4

5 回答 5

7

听起来您在问所有正确的问题 - 您想让代码更易于维护,但意识到这可能会变得笨拙并最终使代码变得更糟而不是更好。想想像“Color.RED,Color.BLACK”这样的东西。

我发现像这样的合理数量的常量使代码更具可读性。我不认为 db 列名属于这样的东西,因为

  • 他们不会经常改变,或者至少他们不应该改变

  • 它们足够多,您将以大量常量结束,此时人们停止使用它们,因为找到常量比仅在数据库中查找该死的名称更难。

我见过像这样的带有数千个常量的 db 文件,包括自定义查询、部分查询等(即使是一个 gem,也喜欢public static final String COMMA=",";处理逗号的拼写将来会发生变化的可能性)。在这一点上,它们变成了“使用一次”的字符串,没有人敢改变它们。

关于字符串常量的另一个警告 - final 作为字符串编译到你的类中。因此,如果您重新编译常量类,而不是使用该定义的类,则最终可能导致新定义无法传播。

于 2010-12-17T18:40:00.463 回答
2

您是否考虑过使用实体映射框架(如 Hibernate)?

它可以将所有数据库表信息(以及所有其他数据库特定信息)存储在配置文件中。它还在“硬”数据库设计和您的应用程序之间提供了一个分离层(这将更容易吸收对两者的更改)。

于 2010-12-17T18:34:43.260 回答
1

您可以创建一个定义常量的接口。

这是 Android 中的一个很好的例子。寻找DataColumns接口。

于 2010-12-17T18:38:54.160 回答
1

在我当前的项目中,我们大量使用注释来处理许多与数据库相关的元数据,因为我们不能使用像 Hibernate 这样的框架。对于实际的列常量,是的,我们使用了 try 和 true public static final String。是的,它相当脆弱。

于 2010-12-17T18:40:58.190 回答
0

当我有关于数据库的元数据时,我也会将其存储在数据库中。这就是我看到其他系统运行的方式,如果不是最初那么最终。为确保维护此数据,您可以检查数据库的模式。

于 2010-12-17T18:33:04.313 回答