17

我是一名Java开发人员。我正在使用spring 4.0.1hibernate 4.2.21。我有一堂课如下:

@Entity
@Inheritance(...)
public abstract class Feature{
   @Id
   @GeneratedValue
   protected Long id;

   ...

}

现在我有很多课程如下:

标签.java 类:

@Entity
public class Label extends Feature{
   protected String str;

   ...
}

Point.java 类:

@Entity
public class Point extends Feature{
   protected Integer intg;

   ...
}

我有 20 多个从类扩展的实体Feature类。有没有办法在不编写硬代码的情况下将 这些类(例如Label和)动态添加到项目中?Point

更新

例如,Hibernate 从数据库中获取数据,然后根据这些数据,创建模型。

  1. 可能吗?
  2. 我该怎么办?
4

7 回答 7

6

我认为它不是一个需要动态更改的好的数据库设计。这听起来冗长且不一致。再次观察您的域并尝试设计一个不会在运行时更改的适当实体关系。

于 2015-12-02T20:45:31.933 回答
6

您可以尝试收集构建模型所需的数据并hbm.xml为每个实体生成一个休眠文件(是 xml 格式,并且在读取更新中描述的所需数据后易于使用 java 生成)

之后,您可以按照此http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html#configuration-programmatic以编程方式创建休眠配置对象

如果我很好地理解了您的问题,我认为通过这种方法您可以实现您想要的。

于 2015-12-04T17:08:42.297 回答
5

我认为你想在运行时生成你的实体类,而不是你必须编写你的 java 文件并编译它等等。如果这是您的要求,您可以使用像javassist这样的字节码生成器在运行时生成和注释您的类文件。然后,您可以使用 JPA、Hibernate 和任何其他 ORM 框架将其持久化到您的表中。

于 2015-11-30T04:41:10.433 回答
3

据我了解,您需要开发一个工具,收集与表具有一对一关系的Feature表名。

我的建议是这样的(用 Oracle 测试):

1)从您的数据库中,获取引用您的功能表的表元数据。下面将打印与您的表有外键关系的标签、点等表。
如果您只想生成一个子集(不相关的表也可能具有这种关系),您可能会放置一个公共外键列名并在此类标记的帮助下过滤掉不相关的表。

Connection connection = jdbcTemplate.getDataSource().getConnection();
DatabaseMetaData metaData = connection.getMetaData();

ResultSet exportedKeys = metaData.getExportedKeys(connection.getCatalog(), "<your_schema_name>", "FEATURE");
while (exportedKeys.next()){
    String fkTableName = exportedKeys.getString("FKTABLE_NAME");
    String fkColumnName = exportedKeys.getString("FKCOLUMN_NAME");  
    System.out.println("[fkTableName:" + fkTableName + "], [fkColumnName" + fkColumnName + "]");
}
exportedKeys.close();


2)对于您上面收集的表,对于我们关注的每个表,获取类型和列的表元数据。

ResultSet columns = metaData.getColumns(connection.getCatalog(), "<your_schema_name>", "<your_table_name>", null);
while (columns.next()){
    String columnName = columns.getString("COLUMN_NAME");
    String typeName = columns.getString("TYPE_NAME");
    System.out.println("[columnName:" + columnName + "], [typeName" + typeName + "]");
}
columns.close();


3) 根据 2 的结果生成您的 Java 类。使用字段、getter setter、注释等。然后将它们复制到您的源目录中。你知道其余的:)

希望这会有所帮助。

于 2015-12-03T09:08:56.863 回答
2

不要重复自己。

如果您真的需要这些类,请使用 IDE(如 eclipse)来生成这些类。或者使用泛型和继承来只创建一个能够存储字符串和整数的类。

但是,如果您实际上不需要类,请生成 SQL(不是 JPQL 或 HQL)并将数据存储在java.util.Map类似的数据结构中。

课程有利于:

  • 类型安全
  • 将逻辑(方法)与数据(字段)相结合
  • 描述关系

在您的情况下,您可能只需要:

  • 在运行时存储结构化数据。
于 2015-12-03T09:26:11.710 回答
2

我认为您可以使用 Hibernate 逆向工程为所有数据库表生成实体。请参考链接。这将逐步解释使用休眠逆向工程从数据库生成实体的过程。

于 2015-12-01T12:00:34.543 回答
1

我认为您可以使用 eclipse 来做到这一点,但是必须或多或少地修改类以保留继承层次结构。

  • 右键单击项目名称并选择属性
  • 如果未启用项目构面,则使用项目构面

在此处输入图像描述

  • 如果未选择JPA ,请单击它,然后单击OK关闭项目属性窗口。

  • 在项目属性中启用 JPA 后,现在再次右键单击 eclipse 项目名称,您应该会看到一个新的上下文菜单项JPA 工具出现。选择从表中生成实体

在此处输入图像描述

选择一个数据库连接,让 Eclipse 获取用于生成类的表。

这是在eclipse中设置数据库的方法

  • 最好使用上述方法在虚拟项目中创建实体并将实体类复制到真实项目中。

  • Eclipse 的类重构可用于保留您想要的继承层次结构。

希望这可以帮助。

于 2015-11-30T05:07:04.540 回答