【问题标题】:Dynamic fields in JSF beansJSF bean 中的动态字段
【发布时间】:2010-07-20 13:56:21
【问题描述】:

我想让我的客户在 CMS 中动态创建自己的字段和 bean。

同样,一旦他创建了一个表单,我需要创建一个可以保存到数据库中的 Hibernate Entity。

有办法吗?

我正在使用 JSF2 和 Hibernate 3

有没有重新编译?

【问题讨论】:

    标签: java hibernate spring jsf


    【解决方案1】:

    动态创建表和实体在 IMO 不是一个好主意。 Hibernate 并不是为此而生的,生成实体只是问题的一小部分。您必须将它们添加到配置中,重建会话工厂,更新模型。那么后续重启应用呢?不推荐,直接忘记这个方法...

    另一种选择是使用Entity-Attribute-Value (EAV) 模型。这是许多 CMS 正在做的事情。我从来没有用 Hibernate 实现过这个,但它是可行的(并且已经完成了)。以下是一些资源:

    但老实说,我不会实现自己的 CMS,而是重用现有的 CMS。 One Hippo 似乎是候选人。

    另见

    相关问题

    【讨论】:

    • 谢谢。我的问题是,一旦我们已经使用了 Hibernate + Hibernate Search,您认为是否值得切换到 MyBatis 或其他 O/R Mapping?
    • @Odelya:嗯,我猜不是。实际上,我几乎完全重写了我的答案,因为 Hibernate 已经被用来实现 EAV 方法(所以不管我的意见如何,这是可行的)。但是,正如我所写的,我不会再编写另一个 CMS 并重用现有的提供您正在寻找的功能的CMS。
    • 谢谢。添加/删除字段的能力只是我的应用程序的一小部分。所以我想我将不得不整合我的代码
    【解决方案2】:

    最简单的方法是使用List<String> 作为字段名称,使用Map<String, Object> 作为字段值。可以使用动态键在 EL 中访问地图,如下所示:

    <ui:repeat value="#{bean.fieldnames}" var="fieldname">
        <h:inputText value="#{bean.fieldvalues[fieldname]}" /><br />
    </ui:repeat>
    

    另一种完全不同的选择是使用ASM/Javassist 等工具自动生成类并动态创建数据库表。但这还有很多工作要做。

    【讨论】:

    • 我不明白答案。假设我的用户想要创建一个名为:Order 的新对象,其中包含自定义字段:名称、时间、用户名。如何创建一个全新的 bean?我知道我可以迭代结果,但是如何根据 DB 信息和 Hibernate 对象创建一个新 bean?
    • 然后去最后一个建议。按照链接,它们包含教程。并不意味着苛刻,但鉴于您到目前为止所展示的知识,这将是一段漫长的旅程。这就是为什么我提出了一个简单且更抽象的解决方案以及第一个建议。
    • 再想一想,您实际上不是在重新发明/在家发展 CMS 吗?正如 Pascal 提到的,我宁愿寻找现有的 CMS。 Hippo、Alfresco、Nuxeo、Liferay 等
    猜你喜欢
    • 2013-03-26
    • 2018-03-27
    • 2013-09-05
    • 2013-01-17
    • 1970-01-01
    • 2011-04-08
    • 2011-06-01
    • 2013-09-08
    • 1970-01-01
    相关资源
    最近更新 更多