JDBC ResultSet :: RefreshRow不能与级联更新一起使用

时间:2012-03-04 08:10:27

标签: java postgresql jdbc resultset

我正在尝试使用Postgres作为数据库将一个快速的JDBC应用程序放在一起,并且遇到了一个有趣的问题。

我目前有2个表,table1和table2。

CREATE TABLE table1
(
      a character varying NOT NULL,
      b integer NOT NULL,
      CONSTRAINT table1_pkey PRIMARY KEY (b)
)

CREATE TABLE table2
(
      c character varying NOT NULL,
      d integer,
      CONSTRAINT table2_pkey PRIMARY KEY (c),
      CONSTRAINT table2_d_fkey FOREIGN KEY (d),
          REFERENCES table1(b) MATCH SIMPLE
          ON UPDATE CSCADE ON DELETE CASCADE
)

作为我的计划的后端,我SELECT * ResultSet并从我的查询中抓住ResultSet.TYPE_SCROLL_INSENSITIVE。每个表中都有一行简单的值,似乎并不重要。

我的语句是使用标记ResultSet.CONCUR_UPDATEResultSet rs/rs2创建的。虽然我也尝试过SCROLL_SENSITIVE。

如果我尝试以下(assumgin rs.first(); // move to the first row (only row) rs.updateInt(2, 50); // update our primary key, which is also the cascading fk // 50 could be any number print(rs); // Will show the old value rs.updateRow(); print(rs); // Will show the new value rs2.refreshRow(); // make sure we get the latest data from table2 print(rs2); // will show the old data? 有效并分别指向table1 / table2:

SELECT

我希望看到由于级联而产生的新值。如果我退出并重新运行应用程序,而不是更改任何输入,那么它将打印正确的table2值。我猜这是因为重新运行{{1}}语句。如果我通过运行psql或pgadmin3来查看表,那么值似乎正在改变。所以看起来像refreshRow()并没有降低最新的东西。有人会有任何想法吗?

我正在使用:

  • java 1.6_29
  • 的PostgreSQL-9.1-901.jdbc4.jar

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

我希望你把它整理好,因为这是一个古老的问题,但仅仅是为了记录,我在这里发布了一个我试过的片段,它对我有用:

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT * FROM table1");

Statement stmt2 = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs2 = stmt2.executeQuery("SELECT * FROM table2");

rs.first(); // move to the first row (only row)
rs.updateInt(2, 50); // update our primary key, which is also the
                            // cascading fk 50 could be any number
System.out.println(rs.getString(2)); // Prints the old value 12
rs.updateRow();
System.out.println(rs.getString(2)); // Prints the new value 50

rs2.first();
rs2.refreshRow(); // make sure we get the latest data from table2
System.out.println(rs2.getString(2)); // Prints the new value 50