2015-12-11 2 views
1

В моей базе данных у меня есть две таблицы под названием car and ad. В автомобиле у меня есть внешний ключ, ссылающийся на значение adId в объявлении. Когда я запускаю свой код, я не получаю никаких ошибок, но данные вставляются только в объявление, а не в автомобиль. Какие-либо предложения? Вот мой код:Нет ошибок, но данные не вставлены в таблицу

public void createAd(Ad ad, Car car) { 
    try { 
     Class.forName("org.postgresql.Driver"); 
     if (con != null) { 
      ps = con.prepareStatement("INSERT INTO \"ad\"(\"title\", \"description\", \"author\", \"image\") VALUES (?, ?, ?, ?)"); 
      ps.setString(1, ad.getTitle()); 
      ps.setString(2, ad.getDescription()); 
      ps.setString(3, ad.getAuthor()); 
      ps.setBytes(4, ad.getImage()); 
      ps.executeQuery(); 

      ps = con.prepareStatement("SELECT currval('\"ad_adId_seq\"');"); 
      rs = ps.executeQuery(); 
      rs.next(); 
      int adId = rs.getInt("currval"); 
      ps = con.prepareStatement("INSERT INTO \"ad\"(\"adId\") VALUES (?);"); 
      ps.setInt(1, adId); 
      ps.executeUpdate(); 
      ad.setAdId(adId); 

      ps = con.prepareStatement("INSERT INTO \"car\"(\"distanceTraveled\", \"age\", \"condition\", \"vin\", \"brand\", \"price\", \"ad_adId\") VALUES (?, ?, ?, ?, ?, ?, ?)"); 
      ps.setInt(1, car.getDistanceTraveled()); 
      ps.setInt(2, car.getAge()); 
      ps.setString(3, car.getCondition()); 
      ps.setString(4, car.getVIN()); 
      ps.setString(5, car.getBrand()); 
      ps.setInt(6, car.getPrice()); 
      ps.setInt(6, adId); 
      ps.executeQuery(); 
      car.setAdId(adId); 
     } 
    } catch (Exception ex) { 
     System.out.println(ex); 
    } 
} 
+1

Кроме того, вы используете 'ps.executeQuery()' для вставки в машину. Попробуйте 'ps.executeUpdate()' – DBug

+0

Вероятно, ваш объект 'con' имеет значение null. Пожалуйста, покажите код, в котором вы также инициализируете объект соединения 'con'. – dan

ответ

1

Существует ошибка в последнем запросе:

ps.setInt(7, adId); 

вместо

ps.setInt(6, adId); 
+0

Омг, я чувствую себя таким глупым. Иногда я думаю, вам просто нужно пару свежих глаз, чтобы взглянуть. Я думаю, что он должен сделать трюк, попробует это позже. Спасибо! – Jesper

+0

Нет проблем, вы должны, вероятно, увидеть весну, MVC и использовать бобы. Это стандартные способы работы CRUD, а также для любого приложения (особенно для предприятия). Счастливое кодирование! –

1

Я предлагаю вам взглянуть на spring-database. Использование JdbcTemplate уменьшит количество кода плиты котла JDBC, и более важно будет заботиться о многих утечках соединений jdbc для вас.

Если вам нужно использовать простой JDBC, вам необходимо правильно инициализировать объект подключения и использовать update вместо query при использовании операторов обновления.

Также необходимо правильно закрыть создаваемые объекты statement. Вы должны сделать что-то похожее на код ниже:

Connection con = null; 
PrepareStatement ps1 = null; 
PrepareStatement ps2 = null; 
PrepareStatement ps3 = null; 
PrepareStatement ps4 = null; 
ResultSet rs = null; 

String url = "jdbc:postgresql://localhost/dbName"; 
String user = "userName"; 
String password = "userPass"; 

try { 
    con = DriverManager.getConnection(url, user, password); 
    ps1 = con.prepareStatement("INSERT INTO \"ad\"(\"title\", \"description\", \"author\", \"image\") VALUES (?, ?, ?, ?)"); 
    ps1.setString(1, ad.getTitle()); 
    ps1.setString(2, ad.getDescription()); 
    ps1.setString(3, ad.getAuthor()); 
    ps1.setBytes(4, ad.getImage()); 
    ps1.executeUpdate(); 

    ps2 = con.prepareStatement("SELECT currval('\"ad_adId_seq\"');"); 
    rs = ps2.executeQuery(); 
    if(rs.next()) 
    int adId = rs.getInt("currval"); 
    } 
    ps3 = con.prepareStatement("INSERT INTO \"ad\"(\"adId\") VALUES (?);"); 
    ps3.setInt(1, adId); 
    ps3.executeUpdate(); 
    ad.setAdId(adId); 

    ps4 = con.prepareStatement("INSERT INTO \"car\"(\"distanceTraveled\", \"age\", \"condition\", \"vin\", \"brand\", \"price\", \"ad_adId\") VALUES (?, ?, ?, ?, ?, ?, ?)"); 
    ps4.setInt(1, car.getDistanceTraveled()); 
    ps4.setInt(2, car.getAge()); 
    ps4.setString(3, car.getCondition()); 
    ps4.setString(4, car.getVIN()); 
    ps4.setString(5, car.getBrand()); 
    ps4.setInt(6, car.getPrice()); 
    ps4.setInt(7, adId); 
    ps4.executeUpdate(); 
    car.setAdId(adId); 
} catch (SQLException ex) { 
    Logger lgr = Logger.getLogger(getClass().getName()); 
    lgr.log(Level.SEVERE, "Unable to execute updates", ex); 
} finally { 
    try { 
    if (rs != null) 
     rs.close(); 
     if (ps1 != null) 
     ps1.close(); 
     if (ps2 != null) 
     ps2.close(); 
     if (ps3 != null) 
     ps3.close(); 
     if (ps4 != null) 
     ps4.close(); 
     if (con != null) 
     con.close(); 
    } catch (SQLException ex) { 
     Logger lgr = Logger.getLogger(getClass().getName()); 
     lgr.log(Level.WARNING, "Unable to close the connection", ex); 
    } 
} 
Смежные вопросы