Jdbc H2数据库在使用ALTER TABLE添加新列后插入数据异常

Jdbc H2数据库在使用ALTER TABLE添加新列后插入数据异常,jdbc,h2,Jdbc,H2,我正在向表中添加新列,如下代码所示: String sql = "ALTER TABLE PROJE_ALAN ADD NEWCOLUMN VARCHAR(30)"; PreparedStatement ps = conn.prepareStatement(sql.toString()); ps.execute(); conn.close(); ps.close(); 这是在向我的表中添加新列,但当我要添加新数据时,会引发异常: Caused b

我正在向表中添加新列,如下代码所示:

    String sql = "ALTER TABLE PROJE_ALAN ADD NEWCOLUMN VARCHAR(30)";
    PreparedStatement ps = conn.prepareStatement(sql.toString());
    ps.execute();
    conn.close();
    ps.close();
这是在向我的表中添加新列,但当我要添加新数据时,会引发异常:

    Caused by: org.h2.jdbc.JdbcSQLException: General error: "net.sourceforge.hatbox.RTreeInternalException: Unable to select meta node"; SQL statement: INSERT INTO "PROJE_ALAN" ( "THE_GEOM","JJ","KK","NEWCOLUMN" ) VALUES ( ST_GeomFromText ('MULTIPOLYGON (((-244856.06897661195 4166022.019422841, 189248.78294214187 4442270.561552957, 778743.439809086 4301679.785647452, 662817.7123080553 4101892.893571207, 83189.0748029009 3707252.1190996123, -244856.06897661195 4166022.019422841)))',23036),'','','') [50000-172]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:158)
at org.h2.message.DbException.convert(DbException.java:281)
at org.h2.schema.TriggerObject.fireRow(TriggerObject.java:215)
at org.h2.table.Table.fireRow(Table.java:904)
at org.h2.table.Table.fireAfterRow(Table.java:895)
at org.h2.command.dml.Insert.insertRows(Insert.java:128)
at org.h2.command.dml.Insert.update(Insert.java:86)
at org.h2.command.CommandContainer.update(CommandContainer.java:79)
at org.h2.command.Command.executeUpdate(Command.java:235)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:180)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:155)
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
at org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
at org.geotools.jdbc.JDBCDataStore.insert(JDBCDataStore.java:1447)
... 17 more

    Caused by: net.sourceforge.hatbox.RTreeInternalException: Unable to select meta node
at net.sourceforge.hatbox.Lock.<init>(Lock.java:88)
at net.sourceforge.hatbox.RTreeSessionDb.<init>(RTreeSessionDb.java:75)
at net.sourceforge.hatbox.jts.InsertTrigger.fire(InsertTrigger.java:43)
at org.h2.schema.TriggerObject.fireRow(TriggerObject.java:201)
... 28 more

    Caused by: org.h2.jdbc.JdbcSQLException: Table "PROJE_ALAN_COPY_11_5_HATBOX" not found; SQL statement: select node_data, id from "PUBLIC"."PROJE_ALAN_COPY_11_5_HATBOX" where id = ? FOR UPDATE [42102-172]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:169)
at org.h2.message.DbException.get(DbException.java:146)
at org.h2.schema.Schema.getTableOrView(Schema.java:419)
at org.h2.command.Parser.readTableOrView(Parser.java:4808)
at org.h2.command.Parser.readTableFilter(Parser.java:1099)
at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1705)
at org.h2.command.Parser.parseSelectSimple(Parser.java:1813)
at org.h2.command.Parser.parseSelectSub(Parser.java:1699)
at org.h2.command.Parser.parseSelectUnion(Parser.java:1542)
at org.h2.command.Parser.parseSelect(Parser.java:1530)
at org.h2.command.Parser.parsePrepared(Parser.java:405)
at org.h2.command.Parser.parse(Parser.java:279)
at org.h2.command.Parser.parse(Parser.java:251)
at org.h2.command.Parser.prepareCommand(Parser.java:218)
at org.h2.engine.Session.prepareLocal(Session.java:425)
at org.h2.engine.Session.prepareCommand(Session.java:374)
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1138)
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:70)
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:644)
at net.sourceforge.hatbox.Lock.<init>(Lock.java:72)
... 31 more
原因:org.h2.jdbc.JdbcSQLException:一般错误:“net.sourceforge.hatbox.RTreeInternalException:无法选择元节点”;SQL语句:在“PROJE_ALAN”(“THE_GEOM”、“JJ”、“KK”、“NEWCOLUMN”)中插入值(ST_GeomFromText((-244856.06897661195 4166022.019422841189248.782942141874442270.56155295778743.4398090864301679.785647452、662817.7123080553 4101892.89357120783189.07189.078029009 3707252.1190996123、-244856.0689611022822.019441)))',23036),'','','') [50000-172]
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
位于org.h2.message.DbException.get(DbException.java:158)
位于org.h2.message.DbException.convert(DbException.java:281)
位于org.h2.schema.TriggerObject.fireRow(TriggerObject.java:215)
位于org.h2.table.table.fireRow(table.java:904)
在org.h2.table.table.firefatterrow(table.java:895)
位于org.h2.command.dml.Insert.insertRows(Insert.java:128)
位于org.h2.command.dml.Insert.update(Insert.java:86)
位于org.h2.command.CommandContainer.update(CommandContainer.java:79)
位于org.h2.command.command.executeUpdate(command.java:235)
位于org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:180)
位于org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:155)
位于org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
位于org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)
位于org.geotools.jdbc.JDBCDataStore.insert(JDBCDataStore.java:1447)
... 还有17个
原因:net.sourceforge.hatbox.RTreeInternalException:无法选择元节点
位于net.sourceforge.hatbox.Lock。(Lock.java:88)
位于net.sourceforge.hatbox.RTreeSessionDb。(RTreeSessionDb.java:75)
net.sourceforge.hatbox.jts.InsertTrigger.fire(InsertTrigger.java:43)
位于org.h2.schema.TriggerObject.fireRow(TriggerObject.java:201)
... 28多
原因:org.h2.jdbc.jdbcsql异常:未找到表“PROJE\u ALAN\u COPY\u 11\u 5\u HATBOX”;SQL语句:从“PUBLIC”中选择节点数据、id。“PROJE\u ALAN\u COPY\u 11\u 5\u HATBOX”其中id=?更新[42102-172]
位于org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
位于org.h2.message.DbException.get(DbException.java:169)
位于org.h2.message.DbException.get(DbException.java:146)
位于org.h2.schema.schema.getTableOrView(schema.java:419)
位于org.h2.command.Parser.readTableOrView(Parser.java:4808)
位于org.h2.command.Parser.readTableFilter(Parser.java:1099)
位于org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1705)
位于org.h2.command.Parser.parseSelectSimple(Parser.java:1813)
位于org.h2.command.Parser.parseSelectSub(Parser.java:1699)
位于org.h2.command.Parser.parseSelectUnion(Parser.java:1542)
位于org.h2.command.Parser.parseSelect(Parser.java:1530)
位于org.h2.command.Parser.parsePrepared(Parser.java:405)
位于org.h2.command.Parser.parse(Parser.java:279)
位于org.h2.command.Parser.parse(Parser.java:251)
位于org.h2.command.Parser.prepareCommand(Parser.java:218)
位于org.h2.engine.Session.prepareLocal(Session.java:425)
位于org.h2.engine.Session.prepareCommand(Session.java:374)
位于org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1138)
在org.h2.jdbc.JdbcPreparedStatement。(JdbcPreparedStatement.java:70)
位于org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:644)
位于net.sourceforge.hatbox.Lock。(Lock.java:72)
... 还有31个
若我重新启动应用程序,那个么我可以将新数据添加到新表中。我认为问题可能是在不重新启动应用程序的情况下刷新索引。可能和帽盒有关


那么我错过了什么呢?

这不是哈特博克斯的错。这是H2中的一个bug。H2引擎在ALTER TABLE语句后重新创建触发器,但使用临时表名调用trigger.init。因此,触发器使用错误的表名初始化。创建触发器后,H2将表重命名为原始值

我对这个bug的解决方法是(它也有bug,但仍然有效):

将net.sourceforge.hatbox.jts.Insert、Update、Delete触发器初始化方法更改为

public void init(Connection con, String schema, String trigger, String table,
        boolean before, int type) throws SQLException {

    this.schema = schema;
    this.table = table;

    if(this.table.contains("_COPY_")) {
        this.table = table.substring(0, table.indexOf("_COPY_"));
    }
}

在使用此功能时,您必须保持安全,如果表名上有副本,则无法使用。您可以像正则表达式匹配一样将
\u COPY\u
更改为
*\u COPY\u

找不到表通常意味着您正在使用不同的数据库。你的数据库URL是什么?是否可以使用数据库文件的绝对路径,例如
jdbc:h2:/data/test
。确保您没有使用相对路径,例如
jdbc:h2:test
。我使用的是数据库文件的绝对路径。若在添加新列后重新启动应用程序,并没有问题,但若不关闭应用程序,它会抛出异常。另外,重命名任何列都不会有任何问题。我看到了,所以它不是数据库URL。表名
PROJE\u ALAN\u COPY\u 9\u 0\u HATBOX
很奇怪,它看起来像一个临时表名;修改一个表将首先创建一个临时表,然后重命名它,但是后缀
\u HATBOX
很奇怪-你知道HATBOX是否使用一个特殊的“表引擎”(即,不是一个普通的H2表)?嗯,我看到后缀
\u HATBOX
是由HATBOX工具添加的。表名
PROJE\u ALAN\u COPY\u 9\u 0
只是一个临时名称,它不应该对工具或应用程序可见。我猜这是因为hatbox触发器在复制数据时看到这个临时表。。。你可以发布完整的堆栈跟踪吗(如果有更多)?嗯,我不太确定,但我认为问题在于Hatbox创建触发器的方式。出于某种原因,临时表上似乎有一个触发器。我想有可能在Hatbox中解决这个问题,但我自己也不了解Hatbox,所以我无能为力。添加列后重新打开数据库是否有效?这是你可能的解决办法吗?