我的申请中有要求。我的表不会事先定义。例如,如果用户按名称创建表单,并添加其属性,如名称,滚动号,主题,类等。然后在运行时,应该有一个由名称学生创建的表列名称,滚动否,主题,类及其相关类及其hibernate映射文件。有没有办法这样做?
提前致谢,
Rima Desai
答案 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,即在运行时定义的实体,但您必须写出映射文件。你应该注意一些关于动态模型的事情:
您可能会限制在运行时定义这些内容(即,您必须直接使用Session
而不是使用{{}中的帮助方法1}}或类似的东西)。
使用HibernateTemplate
s作为实体字段的容器支持动态模型,因此您将在运行时丢失键入和POJO样式的API(无需执行以下操作 - 在动态模型支持中。)
所有这些都表示,您没有提到是否要求动态定义的表在应用程序会话中保持不变。这可能会使事情复杂化。
答案 2 :(得分:1)
上周我正在寻找相同的解决方案然后我从com.sun.tools.javac.Main.compile
类得到了想法,你使用java IO
创建了Entity类并使用java tools
进行编译,为此你需要{{ 1}}找到tools.jar
,现在我正在寻找运行时CLASS_PATH
映射而不重启。
有人在帖子中说这个类型的要求“但不清楚你为什么要做那样的事情”这个要求的答案是hibernate
。而且我也是这样做的。代码如下。
CMS(Content Management System)