使用PostgreSQL数据库的java web服务

使用PostgreSQL数据库的java web服务,java,postgresql,Java,Postgresql,我的代码是用java编写的,我对java非常陌生,所以我希望我的解释是正确的: 我有一个java编写的web服务,它与数据库一起工作。 数据库类型可以是PostgreSQL和mysql。 因此,我的Web服务与两个数据库的JDBC连接一起工作。 我的一个数据库表是表URL, 对于postgressql,其创建方式如下: CREATE TABLE urls ( id serial NOT NULL primary key, url text not null, type integer

我的代码是用java编写的,我对java非常陌生,所以我希望我的解释是正确的: 我有一个java编写的web服务,它与数据库一起工作。 数据库类型可以是PostgreSQL和mysql。 因此,我的Web服务与两个数据库的JDBC连接一起工作。 我的一个数据库表是表URL, 对于postgressql,其创建方式如下:

CREATE TABLE urls ( 
id serial NOT NULL primary key, 
url text not null,   
type integer not null);
CREATE TABLE IF NOT EXISTS URLS ( 
id INTEGER primary key NOT NULL AUTO_INCREMENT, 
url varchar (1600) NOT NULL,   
type INTEGER NOT NULL );
对于mysql,它是这样创建的:

CREATE TABLE urls ( 
id serial NOT NULL primary key, 
url text not null,   
type integer not null);
CREATE TABLE IF NOT EXISTS URLS ( 
id INTEGER primary key NOT NULL AUTO_INCREMENT, 
url varchar (1600) NOT NULL,   
type INTEGER NOT NULL );
当我尝试将数据插入此表时,我使用一个名为URL的实体: 该实体有:

    private BigDecimal id;
    private String url;
    private BigInteger type;
当我尝试向URL表插入值时,我将值分配给URL实体,同时将id保留为NULL,因为它对于mysql是自动递增的,对于postgres是串行的。 该查询适用于my 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');
所以我的问题是,

在java中,如何将默认值分配给BigDecimal值? 从我的实体中删除id是正确的方法吗? 如何确保我对代码所做的任何更改不会损害mysql或我将使用的任何其他数据库?
1-我认为对id字段使用Long或Long类型而不是BigDecimal是合适的

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


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

1-我认为对于id字段,使用Long或Long类型而不是BigDecimal是合适的

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


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

使用此语句时:

INSERT INTO URLS(ID, TYPE, URL) VALUES(NULL, 1, 'DED');
你告诉数据库你想在列ID中插入一个空值,Postgres就会这样做。与MySQL不同,PostgreSQL永远不会隐式地用完全不同的东西替换您提供的值,实际上除了MySQL之外,所有DBM都是这样工作的——当然,除非涉及到某些触发器


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

使用此语句时:

INSERT INTO URLS(ID, TYPE, URL) VALUES(NULL, 1, 'DED');
你告诉数据库你想在列ID中插入一个空值,Postgres就会这样做。与MySQL不同,PostgreSQL永远不会隐式地用完全不同的东西替换您提供的值,实际上除了MySQL之外,所有DBM都是这样工作的——当然,除非涉及到某些触发器


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

如果在insert查询中指定列名,则postgres不采用默认值。因此,您应该使用第二个insert查询

INSERT INTO URLS(TYPE, URL) VALUES(1, 'DED');
这种语法对于postgres和MySQL都是正确的


这将解决您的问题1和3。对于2,不要从实体中删除id字段。此id将成为指向实体特定对象的数据库行的链接。

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

INSERT INTO URLS(TYPE, URL) VALUES(1, 'DED');
这种语法对于postgres和MySQL都是正确的


这将解决您的问题1和3。对于2,不要从实体中删除id字段。此id将成为指向实体特定对象的数据库行的链接。

1。如果我将使用long而不是BigDecimal,我仍然会遇到同样的问题,我必须发送一个值集来使用postgress默认语法,当我的代码是用java编写的时候,我如何才能实现这一点?2.就我所见,实体必须与数据库表结构等效,否则它将不会编译并部署到我的glassfish,因此从实体中删除id似乎不是一个选项。除非我误解了什么。同意,BigDecimal不是这种情况下使用的正确类型,因为数据库端有一个整数。@用户您可能不需要。postgres在使用串行列时接受无id的mysql样式插入。所以插入表c1,c2值v1,v2基本上等于插入表c1,c2,id值v1,v2,默认值;如果id是一个串行列,那么,我正在处理的代码是一个有很多错误的旧代码,其中包括bigdecimal的使用。但这不是我最紧迫的问题。据我所知,我的路径应该会导致我在insert查询中不发送id,因为我已将insertable=false属性添加到实体中的id@列中。但在我看来,我的postgressql JDBC坚持尝试将ID值插入为NULL。知道如何从insert查询中删除ID列吗;如果你有
n@GeneratedValuestrategy=GenerationType.XXX注释,用于id字段并使用JPA,通常使用EntityManager保存实体类;em.持久对象;然后将策略更改为GenerationType.XXX到GenerationType.TABLE。这样,JPA将使用一个表来存储id字段。但是,AFAIK JPA至少Hibernate不支持ID字段的BigDecimal。另一方面,如果id字段在postgres1中以串行方式生成,那么使用普通JDBC仅从insert查询中删除id列将再次解决您的问题。如果我将使用long而不是BigDecimal,我仍然会遇到同样的问题,我必须发送一个值集来使用postgress默认语法,当我的代码是用java编写的时候,我如何才能实现这一点?2.就我所见,实体必须与数据库表结构等效,否则它将不会编译并部署到我的glassfish,因此从实体中删除id似乎不是一个选项。除非我误解了什么。同意,BigDecimal不是这种情况下使用的正确类型,因为数据库端有一个整数。@用户您可能不需要。postgres在使用串行列时接受无id的mysql样式插入。所以插入表c1,c2值v1,v2基本上等于插入表c1,c2,id值v1,v2,默认值;如果id是一个串行列,那么,我正在处理的代码是一个有很多错误的旧代码,其中包括bigdecimal的使用。但这不是我最紧迫的问题。据我所知,我的路径应该会导致我在insert查询中不发送id,因为我已将insertable=false属性添加到实体中的id@列中。但在我看来,我的postgressql JDBC坚持尝试将ID值插入为NULL。知道如何从insert查询中删除ID列吗;如果您对id字段使用@GeneratedValuestrategy=GenerationType.XXX注释并使用JPA,并且通常使用EntityManager保存实体类;em.持久对象;然后将策略更改为GenerationType.XXX到GenerationType.TABLE。这样,JPA将使用一个表来存储id字段。但是,AFAIK JPA至少Hibernate不支持ID字段的BigDecimal。另一方面,如果id字段在postgreswell中以串行方式生成,那么使用普通JDBC仅从插入查询中删除id列将再次解决您的问题,谢谢您提供的信息。我计算了一下,并将实体中的id@列标记为insertable=false。但在我看来,我的postgressql JDBC坚持尝试将ID值插入为NULL。知道我如何从insert查询中删除ID列吗?@user314536:对不起,我没有基于注释的SQL生成经验……好吧,谢谢你提供的信息。我计算了一下,并将实体中的id@列标记为insertable=false。但在我看来,我的postgressql JDBC坚持尝试将ID值插入为NULL。知道我如何从insert查询中删除ID列吗?@user314536:对不起,我没有基于注释的SQL生成经验。。。。