允许用户在Spring MVC Hibernate应用程序中添加自己的自定义字段 - 什么是理想的方法?

时间:2017-01-06 08:04:36

标签: java spring hibernate spring-mvc

我们都可能看到像JIRA这样的应用程序,或者许多CRM或其他应用程序允许其用户为实体定义自己的自定义字段,并使用它做各种各样的事情,比如强制要求,验证它们的值和等等。

我想在我们正在创建的产品中做到这一点。

假设我们的产品允许用户创建他/她自己的项目。项目具有预定义的属性,例如

  • 名称(字符串)
  • 说明(CLOB)
  • 类型(字符串)
  • 所有者(字符串)
  • 状态(字符串)

现在,作为用户,我想将以下自定义字段添加到我的项目

  • 截止日期(日期)

理想情况下,他应该能够在我的产品中创建一个自定义字段,以捕获以下详细信息:

  • 字段名称
  • 字段类型
  • 默认值
  • 值列表(如果该字段是下拉列表)
  • 强制与否

同样,我想允许这个功能不仅可以向项目添加自定义属性,还可以向其他一些实体添加自定义属性。

这是我们正在使用的技术堆栈,到目前为止我们已经很好用。

  • Spring MVC,JSP和jQuery作为Web框架和视图
  • JPA with Hibernate for persistence
  • Oracle,MS SQL,MySQL - 目前我们的产品适用于这些数据库。

我如何处理此要求?我希望接受以下方面的教育:

  • 如何为此决定最佳数据模型?我是否为自定义字段定义添加了一个单独的表,为其值添加了另一个表,并通过外键将它们与我的实体相关联?
  • 我应该如何在JSP / JS层中使用定义的任何自定义字段动态绘制屏幕?
  • 如何让Spring MVC和Hibernate处理所有这些数据模型和视图?

我在这里已经阅读了几个问题,特别是这个

Adding custom fields in my application

读到这个,我可以想出我可以使用NoSQL数据库来实现这个功能。虽然我可以做到这一点,但我想知道是否有任何方式可以在我目前的技术堆栈中实现这一点,以便在我的产品发展的这个阶段不会引入新的东西。

如果我的问题没有框架或措辞不当,我感到非常抱歉。我对这些技术比较陌生,并希望了解每一项挑战。

谢谢, 斯利拉姆

1 个答案:

答案 0 :(得分:0)

您可以使用Collection mappings根据不同的用户保存不同的属性。将额外字段保存为map,其中attribute-name将是KEY,属性值将是地图的VALUE。

@ElementCollection
Map<String, String> data;

此外,您可能希望将地图的密钥保留为枚举,然后您应该检查this已将Enum作为密钥维护的位置Enum是保存在另一个实体中,该实体是该键值对的值。 E.g。

@OneToMany(mappedBy = "valueEntity", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@MapKeyEnumerated(EnumType.STRING)
@MapKeyColumn(name = "fieldType", insertable = false, updatable = false)
private final Map<FieldType, ValueEntity> otherFields = new HashMap<>();

此处字段类型为Enum