Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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
使用Hibernate 4+;_Hibernate_Jpa_Schema_Derby - Fatal编程技术网

使用Hibernate 4+;

使用Hibernate 4+;,hibernate,jpa,schema,derby,Hibernate,Jpa,Schema,Derby,我正在单元测试中使用ApacheDerby10.9.x和HibernateEntityManager 4.1.9.Final。Derby db模式是从JPA注释的实体生成的。只有一个persistence.xml配置文件。我想在单元测试期间/之前/之后转储生成的Derby db模式。程序化的方法是什么 解决方案: // should not be required because Hibernate already started Derby: //Class.forName("

我正在单元测试中使用ApacheDerby10.9.x和HibernateEntityManager 4.1.9.Final。Derby db模式是从JPA注释的实体生成的。只有一个persistence.xml配置文件。我想在单元测试期间/之前/之后转储生成的Derby db模式。程序化的方法是什么

解决方案:

    // should not be required because Hibernate already started Derby:
    //Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();

    try (Connection conn = DriverManager.getConnection ("jdbc:derby:memory:unit-testing;")) {
        String cat = null;
        String schema = "ROOT";

        DatabaseMetaData md = conn.getMetaData();
        ResultSet rs = md.getTableTypes();
        ResultSetUtils.dump(rs);
        rs = md.getTables(cat, schema, null, new String[]{"TABLE"});
        ResultSetUtils.dump(rs);
        rs = md.getColumns(cat, schema, null, null);
        ResultSetUtils.dump(rs);
    }
公开课成绩教程{

private static final Logger logger = Logger.getLogger(ResultSetUtils.class.getName());
private static final String COL_SEPARATOR = ";";

public static int getColForLabel(ResultSet rs, String labelname) throws SQLException {
    ResultSetMetaData rsmd = rs.getMetaData();

    for (int i = 1; i <= rsmd.getColumnCount(); i++) {
        if (labelname.equals(rsmd.getColumnLabel(i))) {
            return i;
        }
    }

    throw new SQLException("Invalid label name " + labelname);
}

public static void dump(ResultSet rs) throws SQLException {

    // the order of the rows in a cursor
    // are implementation dependent unless you use the SQL ORDER statement
    ResultSetMetaData meta = rs.getMetaData();
    int colmax = meta.getColumnCount();
    int i;
    Object o;

    StringBuilder sb = new StringBuilder(512);
    for (i = 0; i < colmax; ++i) {
        if(i>0) {
            sb.append(COL_SEPARATOR);
        }
        String s = meta.getColumnName(i + 1);
        sb.append((s == null) ? "NULL" : s);
        s = meta.getColumnTypeName(i + 1);
        sb.append((s == null) ? "(NULL)" : "("+s+")");
    }
    logger.info(sb.toString());


    // the result set is a cursor into the data.  You can only
    // point to one row at a time
    // assume we are pointing to BEFORE the first row
    // rs.next() points to next row and returns true
    // or false if there is no next row, which breaks the loop
    for (; rs.next();) {
        sb = new StringBuilder(512);
        for (i = 0; i < colmax; ++i) {
            if(i>0) {
                sb.append(COL_SEPARATOR);
            }
            o = rs.getObject(i + 1);    // Is SQL the first column is indexed
            sb.append((o == null) ? "NULL" : o.toString());
        }

        logger.info(sb.toString());
    }
}
private static final Logger Logger=Logger.getLogger(ResultSetUtils.class.getName());
私有静态最终字符串COL_SEPARATOR=“;”;
公共静态int-getColForLabel(结果集rs,字符串labelname)引发SQLException{
ResultSetMetaData rsmd=rs.getMetaData();
对于(int i=1;i 0){
sb.append(COL_分隔符);
}
字符串s=meta.getColumnName(i+1);
sb.append((s==null)?“null”:s);
s=meta.getColumnTypeName(i+1);
sb.追加((s==null)?“(null)”:“(s+”);
}
logger.info(sb.toString());
//结果集是指向数据的光标。您只能
//一次指向一行
//假设我们指向第一行的前面
//rs.next()指向下一行并返回true
//如果没有下一行,则为false,这将中断循环
对于(;rs.next();){
sb=新的StringBuilder(512);
对于(i=0;i0){
sb.append(COL_分隔符);
}
o=rs.getObject(i+1);//第一列是否被索引
sb.append((o==null)?“null”:o.toString());
}
logger.info(sb.toString());
}
}

}访问模式的编程方式是使用DatabaseMetaData类:

从getTables()方法开始,打印返回的信息。

pom.xml:

<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derbytools</artifactId>
    <version>10.9.1.0</version>
</dependency>
没有要打印帮助的参数:

new dblook(new String[]{});
结果:

-- Timestamp: 2013-03-09 00:19:49.733
-- Source database is: memory
-- Connection URL is: jdbc:derby:memory:unit-testing;
-- appendLogs: false

-- ----------------------------------------------
-- DDL Statements for schemas
-- ----------------------------------------------

CREATE SCHEMA "ROOT";

-- ----------------------------------------------
-- DDL Statements for tables
-- ----------------------------------------------

CREATE TABLE "ROOT"."BLOG" ("DTYPE" VARCHAR(31) NOT NULL, "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "BODY" VARCHAR(255), "CREATEDAT" TIMESTAMP, "RAWDATA" BLOB(2147483647), "SUBJECT" VARCHAR(255), "SENDER" VARCHAR(255));

-- ----------------------------------------------
-- DDL Statements for keys
-- ----------------------------------------------

-- primary/unique
ALTER TABLE "ROOT"."BLOG" ADD CONSTRAINT "SQL130309001949220" PRIMARY KEY ("ID");

JDBC元数据操作似乎缺少一些东西,如索引、触发器等。

我更喜欢Derby原生的东西,即我更喜欢Derby告诉我它的模式是什么样子。我不能通过一些方法调用简单地执行“dblook”吗?当然!Java程序可以调用其他Java程序。注意:如果要将DDL存储到文件以供进一步处理(而不是简单地将其输出到stdout),请将额外的参数“-o”、“filename”添加到dblook构造函数的字符串[]参数中。
-- Timestamp: 2013-03-09 00:19:49.733
-- Source database is: memory
-- Connection URL is: jdbc:derby:memory:unit-testing;
-- appendLogs: false

-- ----------------------------------------------
-- DDL Statements for schemas
-- ----------------------------------------------

CREATE SCHEMA "ROOT";

-- ----------------------------------------------
-- DDL Statements for tables
-- ----------------------------------------------

CREATE TABLE "ROOT"."BLOG" ("DTYPE" VARCHAR(31) NOT NULL, "ID" BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 1), "BODY" VARCHAR(255), "CREATEDAT" TIMESTAMP, "RAWDATA" BLOB(2147483647), "SUBJECT" VARCHAR(255), "SENDER" VARCHAR(255));

-- ----------------------------------------------
-- DDL Statements for keys
-- ----------------------------------------------

-- primary/unique
ALTER TABLE "ROOT"."BLOG" ADD CONSTRAINT "SQL130309001949220" PRIMARY KEY ("ID");