Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态检索数据库模式_Java_Database_Jpa_Eclipselink - Fatal编程技术网

Java 动态检索数据库模式

Java 动态检索数据库模式,java,database,jpa,eclipselink,Java,Database,Jpa,Eclipselink,我想为我的应用程序编写一个备份工具,并且必须使用Java1.6。在我的应用程序中有几个数据库,如derby、mySQL。。此外,还有不同的数据库模式名称 我正在使用JPA和Eclipselink 到目前为止,我编写了一个方法,用于创建具有特定架构名称的所有表的列表: private static List<String> getTableNames(String schema, Connection connection) throws SQLException {

我想为我的应用程序编写一个备份工具,并且必须使用Java1.6。在我的应用程序中有几个数据库,如derby、mySQL。。此外,还有不同的数据库模式名称

我正在使用JPA和Eclipselink

到目前为止,我编写了一个方法,用于创建具有特定架构名称的所有表的列表:

    private static List<String> getTableNames(String schema, Connection connection) throws SQLException {
    final String TABLE_NAME = "TABLE_NAME";
    List<String> tableNames = new ArrayList<>();
    DatabaseMetaData dbmd = connection.getMetaData();
    ResultSet tablesRS = dbmd.getTables(null, schema, null, null);
    while (tablesRS.next()) {
        tableNames.add(tablesRS.getString(TABLE_NAME));
    }

    return tableNames;
}
private static List getTableNames(字符串模式、连接)抛出SQLException{
最终字符串TABLE_NAME=“TABLE_NAME”;
List tableNames=new ArrayList();
DatabaseMetaData dbmd=connection.getMetaData();
ResultSet tablers=dbmd.getTables(null,schema,null,null);
while(tablers.next()){
tableNames.add(tablers.getString(TABLE_NAME));
}
返回表名;
}
这是可行的,但我不知道如何获得实际的模式名称。我想我可以通过
EntityManager
获取模式。但我没有找到任何解决办法。有没有办法通过
EntityManager
获取数据库的架构名称? 是否有更好的方法动态检索与不同数据库一起工作的所有表的内容

请注意,我必须使用Java1.6


我知道自Java1.7以来,
连接
对象中存在一个方法
getSchema()

我刚刚找到了解决问题的方法。我想我必须使用模式来获取所有表。事实并非如此:

public static ArrayList getTablesMetadata() throws SQLException {
    String table[] = { "TABLE" };
    ResultSet rs = null;
    ArrayList tables = null;
    // receive the Type of the object in a String array.
    rs = metadata.getTables(null, null, null, table);
    tables = new ArrayList();
    while (rs.next()) {
        tables.add(rs.getString("TABLE_NAME"));
    }
    return tables;
}

查看模式在
persistence.xml
中不可见,因此我确实需要通过
实体管理器
连接
获取它。一些RDBMS不支持“模式”。JPA的大多数用法可能不会指定它,因此会获得URL和/或用户名的默认模式,因此您不在JPA的范围内。您的方法直接使用连接,所有内容都不在JPA的范围内。您应该在JDBC上查看标记问题,如果在java 1.6中,可能需要查找特定于本机DB的SQL,但我不确定原因是什么-为什么需要模式名称?这是在您向应用程序提供连接详细信息时,而不是依赖应用程序查找信息时应该事先知道的信息-这对应用程序来说应该无关紧要,对吗?同意@Chris,JPA与备份无关,“逻辑级别”的分析可能导致错误的“物理解释”(你可以编辑一些“正式”对象),JPA没有备份所需的“快照”概念等。您的问题应该是关于您之后的实际情况,而不是解决方法的问题。仍然不确定您为什么需要表名,因为您的JPA应用程序可以读入实体,并且您的应用程序可以在不知道底层的情况下将数据推送到您需要的任何位置是的,JPA得到了所有的实体,我可以用它们来备份数据库。但我想在某个时候,我必须静态地对实体名称进行编码,比如getClassForName(“实体”).getAnnotation()(不确定如何正确完成,但我想这个想法是正确的)。我知道存在一个方法“getEntities()’。当然,我可以将它们解析为CSV格式进行备份。在进行恢复时,构建实体并将其存储在数据库中会很复杂,不是吗?如果您正在构建通用数据库恢复工具,我根本不会使用JPA,而是直接使用特定于数据库的工具和文档。否则,您的应用程序了解实体(它们是内置的),您的应用程序了解它们的方式与了解要使用的持久化单元或数据源的方式相同,因此能够查询需要备份的数据。如果您正在备份非应用程序数据,则可能需要进行动态查找,然后您必须小心,因为数据源可以连接到不同于的模式您可能需要备份的一个。