【问题标题】:Need some kind of enum which is extensible by database (using Spring 3.2, Hibernate 4.2)需要某种可通过数据库扩展的枚举(使用 Spring 3.2、Hibernate 4.2)
【发布时间】:2013-07-19 15:16:07
【问题描述】:

我们的应用中有以下情况:

  • 我们有UserGroups
  • 这些可以由用户创建
  • 用户可以将一些Users 映射到给定的UserGroup(n:m 关系)

现在我们需要一些特殊的UserGroups,我们可以在 Java 代码中访问它们。所以当这一切都完成后,用户应该会看到他自己创建的UserGroups 和我们的硬编码组(当然不能删除)的混合。

第一个想法是在创建数据库时将这些额外的组放入数据库中,并简单地依赖它们存在的事实,但认为这是不好的做法。 (因为删除或重命名会导致系统崩溃)

第二个想法是为这些特殊群体提供enum。这会很好。但当然你不能扩展一个枚举并在其中放置额外的值。

我认为,它应该是代码中的一些枚举,我们可以在其中放置硬编码组(以便于引用),并且它必须以某种方式连接到数据库,因此用户可以进行他的 User <-> UserGroup 映射(例如他自己创建的团体和我们的特殊团体)。

所以我们需要别的东西,但是什么

编辑:

我们现在选择了一种替代方案作为解决方案,它不会干扰正常数据库设计:

  USER             GROUP_USER             GROUP              ACTION
--------        ----------------        ---------        --------------
id | ...        groupId | userId        id | name        groupId | enum

如您所见,我们并没有尝试将一些静态组放在组表中,而是现在我们将这些内部操作公开给用户界面,现在用户可以说:“操作 A 属于组 X ”。这有几个优点:用户可以选择组的名称,也可以使用多个组。

所以ACTION 表基本上是@CollectionOfElementsGROUP 实体内。

这不是上述问题的确切解决方案,但在我们的例子中,它以一种很好的方式解决了问题,这就是;)

【问题讨论】:

    标签: database spring hibernate enums extends


    【解决方案1】:

    第一个想法是在创建数据库时将这些额外的组放入数据库中,并简单地依赖它们存在的事实,但我认为这是不好的做法。 (因为删除或重命名会导致系统崩溃)

    如果数据库根本不存在,或者如果您的应用程序使用的表和列被重命名,您的应用程序也会崩溃。

    对我来说,这些行的存在以及正确的 ID 或名称只是一个先决条件,就像存在正确类型的表和列一样。

    只需确保记录这些行必须存在的事实。确保应用程序不允许重命名或删除它们,如果您真的担心有人会删除这些行,请检查您在代码中使用的所有硬编码 ID/名称是否在启动时的数据库。

    【讨论】:

    • 也许它不会真的崩溃,但某些功能将不可用,也许会抛出一些异常,这可能会让用户非常恼火。所以我认为必须有一些其他的方式来混合这些东西......所以有一些固定的内容(可通过枚举访问)和一些可以由用户创建/删除的动态内容。
    • 这不会改变任何事情。这些行是您的应用程序正常运行的先决条件。没有它们是一个配置错误,就像忘记向表中添加必需的列一样。坦率地说,如果您拥有数据,我看不到在应用程序代码中使用某些硬编码 ID 的问题。确保数据存在是您的责任。
    • 是的,我认为你是对的。所以我可能应该在应用程序启动时将枚举插入到数据库中(如果还没有的话)。然后像往常一样使用一切。
    • 我认为这是唯一的方法,因为硬编码的值必须始终在数据库中,但是我必须编写一些代码来防止这些值被删除。烦人......你认为使用@Entity继承可能是一个解决方案吗? CustomUserGroup extends UserGroupHardCodedUserGroup extends UserGroup 然后只需获取 UserGroup 即可一次获取两个条目。只需要找出是否有可能对两个表都有唯一约束...
    • 你可以这样做,但我看不出它会如何阻止删除行(直接在数据库中或通过 JPA 从应用程序中删除)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多