Java 如何在Hibernate中动态添加实体?

Java 如何在Hibernate中动态添加实体?,java,hibernate,spring-mvc,datapersistance,Java,Hibernate,Spring Mvc,Datapersistance,我是一名java开发人员。我正在使用和。我的课程如下: @Entity @Inheritance(...) public abstract class Feature{ @Id @GeneratedValue protected Long id; ... } 现在我有很多课,如下所示: Label.java类: @Entity public class Label extends Feature{ protected String str; ... }

我是一名java开发人员。我正在使用和。我的课程如下:

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

   ...

}
现在我有很多课,如下所示:

Label.java类:

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

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

   ...
}
Point.java类:

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

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

   ...
}
我有20多个实体类,从
Feature
类扩展而来。是否有任何方法可以在不编写硬代码的情况下将此类(如
标签
)动态添加到项目中

更新

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

  • 可能吗
  • 我该怎么办

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

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

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

    • 单击JPA(如果未选中),然后单击OK关闭项目属性窗口

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

    选择一个数据库连接,让Eclipse获取用于生成的表 从……开始上课

    这是

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

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


    希望这有帮助。

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

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

    据我所知,您需要开发一个工具,收集与
    Feature
    table具有一对一关系的表名

    我的建议是这样的(通过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();
    
    Connection-Connection=jdbcTemplate.getDataSource().getConnection();
    DatabaseMetaData=connection.getMetaData();
    ResultSet exportedKeys=metaData.getExportedKeys(connection.getCatalog(),“”和“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();
    
    ResultSet columns=metaData.getColumns(connection.getCatalog(),“”,“”,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、注释等,然后将它们复制到源目录中。你知道其余的:)


    希望这对你有帮助。

    不要重复你的话。

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

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

    课程有利于:

    • 类型安全
    • 将逻辑(方法)与数据(字段)相结合
    • 描述关系
    在您的情况下,您可能只需要:

    • 在运行时存储结构化数据

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

    之后,您可以按照以下步骤以编程方式创建hibernate配置对象


    我认为,如果我能很好地理解你的问题,通过这种方法,你可以达到你想要的效果。

    试着用更好的方式描述你的问题?如果我理解你的意思,你可以在你的想法中使用jpa工具自动生成所有实体你所说的
    是什么意思有一种方法可以在不编写硬代码的情况下动态地将这些类(如Label和Point)添加到项目中?
    我想现在你应该已经熟悉如何提问了!我有20多个实体扩展了表单
    功能
    。我想在项目部署时,自动生成所有这些类