JDBC ResultSet :: RefreshRow не работает с каскадным обновлением - PullRequest
2 голосов
/ 04 марта 2012

Я пытаюсь собрать быстрое приложение JDBC, использующее Postgres в качестве базы данных, и столкнулся с интересной проблемой.

В настоящее время у меня есть 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 ing * и держусь за ResultSet из моего запроса.Каждая таблица содержит 1 строку простых значений, и, похоже, не имеет значения, какие они.

Мое утверждение создано с флагами ResultSet.TYPE_SCROLL_INSENSITIVE и ResultSet.CONCUR_UPDATE.Хотя я пробовал и SCROLL_SENSITIVE.

Если я попробую следующее (assumgin ResultSet rs/rs2 действительны и указывают на table1 / 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
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?

Я надеялся увидеть новоезначения из-за каскада. Если я выйду и перезапущу приложение, не меняя никакого ввода, то оно выведет правильные значения таблицы 2. Я предполагаю, что это из-за повторного выполнения оператора SELECT. Если я смотрюза столом, запустив psql или pgadmin3, кажется, что значения меняются. Похоже, что refreshRow () не сбивает последние вещи. Кто-нибудь может понять, почему?

Яиспользуя:

  • java 1.6_29
  • postgresql-9.1-901.jdbc4.jar

Любая помощь будет оценена.

1 Ответ

2 голосов
/ 14 августа 2012

Надеюсь, вы все выяснили, поскольку это старый вопрос, но для справки я выкладываю здесь фрагмент, который я пробовал и который работает для меня:

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
...