在运行时动态创建表和java类

时间:2009-07-28 05:12:10

标签: java hibernate dynamic-data

我的申请中有要求。我的表不会事先定义。例如,如果用户按名称创建表单,并添加其属性,如名称,滚动号,主题,类等。然后在运行时,应该有一个由名称学生创建的表列名称,滚动否,主题,类及其相关类及其hibernate映射文件。有没有办法这样做?

提前致谢,

Rima Desai

3 个答案:

答案 0 :(得分:3)

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

但通常,是的,您可以根据某些输入动态生成数据库表,hibernate类和映射。最简单的方法是使用一些模板引擎。我过去曾使用过Velocity这对于这个任务非常有用,但是如果你想尝试它们还有其他的。

修改

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

为您提供一些良好的开端:

@Entity
public class UserDefinedFormData {
    @Id
    private long id;

    @ManyToOne
    private FormMetadata formMetadata;

    @Lob
    private String xmlUserData;
}

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

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

答案 1 :(得分:3)

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

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

  2. 使用HibernateTemplate s作为实体字段的容器支持动态模型,因此您将在运行时丢失键入和POJO样式的API(无需执行以下操作 - 在动态模型支持中。)

  3. 所有这些都表示,您没有提到是否要求动态定义的表在应用程序会话中保持不变。这可能会使事情复杂化。

答案 2 :(得分:1)

上周我正在寻找相同的解决方案然后我从com.sun.tools.javac.Main.compile类得到了想法,你使用java IO创建了Entity类并使用java tools进行编译,为此你需要{{ 1}}找到tools.jar,现在我正在寻找运行时CLASS_PATH映射而不重启。 有人在帖子中说这个类型的要求“但不清楚你为什么要做那样的事情”这个要求的答案是hibernate。而且我也是这样做的。代码如下。

CMS(Content Management System)