【问题标题】:Dynamically create table and Java classes at runtime在运行时动态创建表和 Java 类
【发布时间】:2010-11-14 14:09:26
【问题描述】:

我的申请中有一个要求。我的表不会事先定义。

例如,如果用户按名称 Student 创建一个表单,并添加其属性,如名称、卷号、主题、类等,那么在运行时,应该有一个名称为 student 的表与列nameroll nosubjectclass 等,还有它的相关类和它的 Hibernate 映射文件。

有什么办法吗?

提前致谢,
里玛德赛

【问题讨论】:

    标签: java hibernate dynamic-data


    【解决方案1】:

    这是可能的,但不清楚你为什么要这样做,所以很难提出任何具体的解决方案。

    但一般来说,是的,您可以根据一些输入动态生成数据库表、休眠类和映射。最简单的方法是使用一些模板引擎。我过去使用过Velocity,它非常适合这项任务,但如果你想尝试它们,还有其他的。

    编辑:

    在 OP 澄清之后,更好的方法是使用 XML 来存储用户定义的数据。 上述解决方案很好,但无论表单是否更改,都需要重新编译应用程序。如果您不想在每次用户编辑后停止并重新编译,XML 是更好的答案。

    给你一些先机:

    @Entity
    public class UserDefinedFormData {
        @Id
        private long id;
    
        @ManyToOne
        private FormMetadata formMetadata;
    
        @Lob
        private String xmlUserData;
    }
    

    给定表单的定义,保存和加载保存为 XML 的数据将是微不足道的。

    如果您需要更多说明,请添加评论。

    【讨论】:

    • 嗨格雷戈里,感谢您的建议。我肯定会检查速度。这样做的原因是我们正在创建一个引擎,用户可以在其中创建表单并稍后使用它们。所以在创建表单的时候,如果可以创建表格及其相关类,那么在使用表单时存储数据就变得容易了。里玛德赛
    • 这是一个练习:假设我添加了“姓名”、“地址”和“邮政编码”属性,并将它们存储在 XML lob 中以获取大约几百万条用户记录 - 我该怎么做关于让每个名字为“Gregory”的人生活在 10 个给定的邮政编码中并按姓名对结果进行排序?
    • 对于简单的搜索 Lucene 就足够了。更复杂的东西可能更难......但这甚至是一个要求吗?我对 OP 的印象是他只需要存储一些自定义表单的数据,他并不真正了解或关心其中的内容。
    • Lucene 是否足以搜索存储在数据库中的 XML?请解释如何在不先检索所有记录的情况下做到这一点。我不确定通过自定义属性搜索是否是这种特殊情况的要求(尽管如果您将学生姓名定义为 OP 指定的,那么想象有人想要搜索或按它排序并不是那么大),但我确实认为您至少应该提及您提出的方法的缺点。
    • 你错了。 Lucene 不需要从数据库中获取所有记录来进行搜索,就像 Google 不需要每次按下搜索按钮时都加载所有 Internet 的网站一样。它使用索引并且非常高效。它还支持按特定属性搜索,而不仅仅是全文搜索。我建议你先阅读 Lucene。
    【解决方案2】:

    Hibernate 支持dynamic models,即在运行时定义的实体,但您必须写出映射文件。关于动态模型,您应该注意几点:

    1. 您可能会在运行时定义这些限制(即,您必须直接使用 Session 而不是使用来自 HibernateTemplate 的辅助方法或类似的东西)。

    2. 使用Maps 作为实体字段的容器支持动态模型,因此您将在运行时丢失输入和 POJO 样式的 API(无需执行超出内置动态的操作模型支持)。

    说了这么多,您没有提到动态定义的表是否需要在应用程序会话中持久存在。这可能会使事情复杂化。

    【讨论】:

      【解决方案3】:

      上周我在寻找相同的解决方案,然后我从com.sun.tools.javac.Main.compile 类中得到了想法,您使用java IO 创建实体类并使用java tools 进行编译,为此您需要tools.jar 才能在@987654325 上定位@,现在我正在寻找运行时hibernate 映射而无需重新启动。 有人在帖子中说关于这种类型的要求“但不清楚你为什么要做这样的事情”答案是这个要求是针对CMS(Content Management System)。我也在做同样的事情。代码如下。

       public static void createClass()
      {
      String methodName=“execute”;
      String parameterName=“strParam”;
      try{
      //Creates DynamicTestClass.java file
      FileWriter fileWriter=new FileWriter(fileName,false);
      fileWriter.write(“public class “+ className +” {\n”);
      fileWriter.write(“public String “+methodName +“(String “+parameterName+“) {\n”);
      fileWriter.write(“System.out.println(\” Testing\”);\n”);
      fileWriter.write(“return “+parameterName +“+ \” is dumb\”;\n }\n}”);
      fileWriter.flush();
      fileWriter.close();
      
      String[] source = { new String(fileName) };
      com.sun.tools.javac.Main.compile(source);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2020-06-25
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2020-05-04
        • 1970-01-01
        相关资源
        最近更新 更多