веб-сервис Java, работающий с базой данных PostgreSQL - PullRequest
1 голос
/ 27 февраля 2011

мой код написан на Java, и я действительно новичок в Java, поэтому я надеюсь, что мои объяснения верны: У меня есть веб-сервис, написанный на Java, который работает с базой данных. Типы базы данных могут быть PostgreSQL и MySQL. поэтому мой веб-сервис работает с соединением JDBC для обеих баз данных. одна из моих таблиц базы данных - это таблицы URL, для postgressql он создается так:

CREATE TABLE urls ( 
id serial NOT NULL primary key, 
url text not null,   
type integer not null);

для mysql это выглядит так:

CREATE TABLE IF NOT EXISTS URLS ( 
id INTEGER primary key NOT NULL AUTO_INCREMENT, 
url varchar (1600) NOT NULL,   
type INTEGER NOT NULL );

когда я пытаюсь вставить данные в эту таблицу, я использую сущность с именем urls: эта сущность имеет:

    private BigDecimal id;
    private String url;
    private BigInteger type;

Когда я пытаюсь вставить значения в таблицу URL-адресов, я присваиваю значения сущности URL-адресов, оставляя идентификатор как NULL, так как это AUTO_INCREMENT для mysql и serial для postgres. запрос работает для моего sql, но не для postgress. в журнале сервера postgres я вижу следующую ошибку:

null value in column "id" violates not-null constraint

потому что я посылаю NULL в качестве значения идентификатора. Я обнаружил, что для того, чтобы запрос работал, я должен использовать этот запрос:

INSERT INTO URLS(ID, TYPE, URL) VALUES(DEFAULT, 1, 'DED'); or this one:
INSERT INTO URLS(TYPE, URL) VALUES(1, 'DED'); or this one:

вместо этого, который я использую:

INSERT INTO URLS(ID, TYPE, URL) VALUES(NULL, 1, 'DED');

так что мой вопрос,

  1. как мне присвоить значение DEFAULT значению BigDecimal в java?
  2. Является ли удаление идентификатора из моей сущности правильным способом?
  3. как я могу убедиться, что любые изменения, которые я делаю в своем коде, не повредят MySQL или любой другой базе данных, которую я буду использовать?

Ответы [ 3 ]

2 голосов
/ 27 февраля 2011

Если вы укажете имя столбца в запросе на вставку, postgres не примет значение по умолчанию.Поэтому вам следует использовать второй запрос на вставку.

INSERT INTO URLS(TYPE, URL) VALUES(1, 'DED');

Этот синтаксис корректен как для postgres, так и для MySQL.

Это должно решить ваши вопросы (1) и (3).Для (2) НЕ удаляйте поле id из вашей сущности.Этот идентификатор будет вашей ссылкой на строку базы данных для конкретного объекта сущности.

1 голос
/ 27 февраля 2011

При использовании этого утверждения:

INSERT INTO URLS(ID, TYPE, URL) VALUES(NULL, 1, 'DED');

вы сообщаете базе данных, что хотите вставить значение NULL в идентификатор столбца, и Postgres сделает именно это. В отличие от MySQL, PostgreSQL никогда не будет косвенно заменять значение, которое вы предоставляете, чем-то совершенно другим (фактически, все СУБД, кроме MySQL, работают таким образом - если, конечно, не задействован какой-либо триггер).

Таким образом, единственное решение состоит в том, чтобы фактически использовать INSERT, который не предоставляет значение для столбца ID. Это должно работать и на MySQL.

1 голос
/ 27 февраля 2011

1 - Я думаю, что для полей идентификаторов целесообразно использовать типы Long или long вместо BigDecimal.

2 - Да, это обычно помогает, но снижает переносимость.Кстати, использование платформы ORM, такой как Hibernate, может быть хорошим выбором.

3 - Интеграционное тестирование обычно помогает, и вы можете принять разработку стиля TDD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...