使用 PostgreSQL 数据库的 java web 服务

发布于 2024-10-19 04:56:09 字数 1356 浏览 1 评论 0原文

我的代码是用java编写的,我对java真的很陌生,所以我希望我的解释是正确的: 我有一个java编写的网络服务,可以与数据库一起使用。 数据库类型可以是PostgreSQL和mysql。 所以我的 Web 服务可以使用两个数据库的 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;

当我尝试向 urls 表插入值时,我将值分配给 urls 实体,同时将 id 保留为 NULL,因为它对于 mysql 是 AUTO_INCRMENT,对于 postgres 是串行。 该查询适用于我的 sql,但不适用于 postgress。 在 postgres 服务器日志中,我可以看到以下错误:

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

因为我发送 NULL 作为 id 值。 我发现为了使查询正常工作,我应该使用这个查询:

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 值分配给 java 中的 BigDecimal 值?
  2. 从我的实体中删除 id 是正确的方法吗?
  3. 我如何确保对代码所做的任何更改都不会损害 mysql 或我将使用的任何其他数据库?

my code is written in java, and I am really new to java, so i hope my explanations are correct:
i have a java written web service that works with a data base.
the data base types can be PostgreSQL and mysql.
so my webservice works with the JDBC connection for both data bases.
one of my data base tables is table urls,
for postgressql it is created like this:

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

for mysql it is creates like this:

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

when I try inserting data to this table I use an entity called urls:
this entity has:

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

when I try to insert values to the urls table I assign values to the urls entity, while leaving the id as NULL since it is AUTO_INCREMENT for mysql and serial for postgres.
the query works for my sql, but fails for postgress.
in the postgres server log I can see the following error:

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

cause I sends NULL as the id value.
I found out that in order for the query to work I should use this query:

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

instead of this one, that I use:

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

so my question is,

  1. how do I assign the DEFAULT value to a BigDecimal value in java ?
  2. is removing the id from my entity is the right way to go ?
  3. how can I make sure that any changes I do to my code wont harm the mysql or any other data base that I will use ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半岛未凉 2024-10-26 04:56:09

如果您在插入查询中指定列名,则 postgres 不会采用默认值。所以你应该使用第二个插入查询。

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

此语法对于 postgres 和 MySQL 都是正确的。

这应该可以解决您的问题(1)和(3)。对于 (2),请勿从您的实体中删除 id 字段。该 ID 将成为实体特定对象的数据库行的链接。

If you specify the column name in the insert query then postgres does not take the default value. So you should use your second insert query.

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

This syntax is correct for both postgres and MySQL.

This should resolve your question (1) and (3). For (2) DO NOT delete the id field from your entity. This id is going to be your link to the database row for a specific object of the entity.

千纸鹤 2024-10-26 04:56:09

1 - 我认为对于 id 字段使用 Long 或 long 类型而不是 BigDecimal 是正确的。

2 - 是的,它通常会有所帮助,但会降低可移植性。顺便说一句,使用像 Hibernate 这样的 ORM 框架可能是一个不错的选择。

3 - 集成测试通常会有所帮助,您可能希望采用 TDD 风格开发。

1 - I think it is proper to use Long or long types instead of BigDecimal for id fields.

2 - Yes it generally helps, but it lowers portability. BTW, using an ORM framework like Hibernate may be a good choice.

3 - Integration testing usually helps and you may want to adopt TDD style development.

单身狗的梦 2024-10-26 04:56:09

使用此语句时:

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

您告诉数据库您想要将 NULL 值插入到列 ID 中,Postgres 将执行此操作。与 MySQL 不同,PostgreSQL 永远不会隐式地用完全不同的值替换您提供的值(实际上,除 MySQL 之外的所有 DBMS 都是这样工作的 - 当然,除非涉及某些触发器)。

因此,唯一的解决方案是实际使用不为 ID 列提供值的 INSERT。这应该也适用于 MySQL。

When using this statement:

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

you are telling the database that you want to insert a NULL value into the column ID and Postgres will do just that. Unlike MySQL, PostgreSQL will never implicitely replace a value that you supply with something totally different (actually all DBMS except MySQL work that way - unless there is some trigger involved of course).

So the only solution to is to actually use an INSERT that does not supply a value for the ID column. That should work on MySQL as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文