2012-03-04 71 views
2

我試圖用Postgres作爲數據庫將一個快速的JDBC應用程序放在一起,並遇到一個有趣的問題。JDBC ResultSet :: RefreshRow無法與級聯更新

我目前有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_INSENSITIVEResultSet.CONCUR_UPDATE創建的。儘管我也嘗試過SCROLL_SENSITIVE。

如果我嘗試以下方法(assumgin ResultSet rs/rs2分別以表1 /表2是有效的,點:

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? 

我希望看到由於級聯的新值。如果我退出並重新運行應用程序,不改變任何輸入,然後它會打印正確的table2值。我猜這是由於重新運行SELECT聲明。如果我通過運行psql或pgadmin3查看錶,這些值看起來像他們所以看起來refreshRow()並沒有把最新的東西搞垮。有沒有人知道爲什麼?

我使用:

  • 的Java 1.6_29
  • PostgreSQL相關9.1-901.jdbc4.jar

任何幫助,將不勝感激。

回答

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