【问题标题】:One Field is not getting saved to the database, always returns as 0.0一个字段未保存到数据库中,始终返回为 0.0
【发布时间】:2020-08-16 23:24:51
【问题描述】:

我试图将产品实体保存在 postgres 表中,如果我从邮递员发送请求,它会返回 sved 对象,但 MRP 字段始终为 0.0

实体类:

package com.acms.models;

import java.time.Instant;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "product")
public class Product {
    @Id
    @Column(name = "productid")
    private String productId;
    @Column(name = "timestamp")
    private long timeStamp;
    private String description;
    private String name;
    @Column(name = "mrp")
    private double mRP;
    private int quantity;
    private double promotion;

    public Product() {
        super();
        long epochTime = Instant.now().getEpochSecond();
        this.timeStamp = epochTime;
    }

    public String getProductId() {
        return productId;
    }

    public void setProductId(String productId) {
        this.productId = productId;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getMRP() {
        return mRP;
    }

    public void setMRP(double mRP) {
        this.mRP = mRP;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public double getPromotion() {
        return promotion;
    }

    public void setPromotion(double promotion) {
        this.promotion = promotion;
    }

    @Override
    public String toString() {
        return "Product [productId=" + productId + ", timeStamp=" + timeStamp + ", description=" + description
                + ", name=" + name + ", MRP=" + mRP + ", quantity=" + quantity + ", promotion=" + promotion + "]";
    }
}

控制器:

@PostMapping("/product/save")
    public Product postDataToProductTable(@RequestBody Product product) {
        return this.productService.postDataToProductTable(product);
    }

服务:

public Product postDataToProductTable(Product product) {
        return this.productRepository.save(product);
    }

使用 url 和对象发送的请求:

http://localhost:8080/product/save
{
    "productId":"p106",
    "description":"butter",
    "name":"amul",
    "mRP":"200",
    "quantity":"8",
    "promotion":"5.0"
}

对象返回:

{
    "productId": "p106",
    "description": "butter",
    "name": "amul",
    "quantity": 8,
    "promotion": 5.0,
    "mrp": 0.0
}

注意上面的情况,mrp 返回为 0.0,但所有其他字段都很好。

postgres 中的表格:

CREATE TABLE product (
    serialNumber SERIAL,
    productID VARCHAR(50) NOT NULL,
    timeStamp bigint NOT NULL,
    description VARCHAR(50),
    name VARCHAR(50) NOT NULL,
    MRP NUMERIC NOT NULL,
    quantity int NOT NULL,
    promotion NUMERIC,
    PRIMARY KEY(productID),
    UNIQUE(productID, timeStamp)
);

【问题讨论】:

  • 数据库中也是0.0吗?
  • 是的,我认为它被保存为默认值,我不知道为什么它不映射到 mRP
  • 我认为这是因为注释说列名mrp(情人大小写)数据库说“MRP”大写)。
  • 将@Column(name = "mrp") 更改为@Column(name = "MRP")
  • 不,postgres 将所有内容都转换为小写,即使我在实体类中将 mrp 更改为 MRP,它仍然返回 0 并在数据库中输入 0。

标签: java postgresql hibernate spring-boot jpa


【解决方案1】:

可能是因为您的 JSON 请求将 mRP 作为字符串类型发送,但在您的模型中它被定义为 double。在 JSON 请求中丢失 mRP 值周围的 "",看看是否有帮助。

另一个选项是您在数据库中将此类型定义为numeric,但在模型中它是double。根据我的经验,我更喜欢使用 BigDecimal 映射到 postgres 中的 numeric 字段。但是,如果它必须是您的模型中的double,那么为什么不将它也用作数据库中的类型呢?并非所有可以保存在 numeric 字段中的内容实际上都可以在 Java double 中表示。

Postgres 数据类型:https://www.postgresql.org/docs/9.1/datatype-numeric.html

另外(来自 cmets 的讨论)Json 和模型中的字段名称之间的大小写不一致,如果使用 Spring Data JPA/Spring MVC 可能会导致问题。

【讨论】:

  • 没有帮助:/
  • 那么促销是怎么起作用的呢?这也是数字和双精度。
  • @MadhumitaGangaS 你是对的,这很奇怪。我仍然建议选择推荐的数据类型。如果这没有帮助,您应该打开 sql 日志记录,特别是将 org.hibernate.SQL 日志节点设置为 debug,它应该会显示此请求正在执行哪些更新和哪些查询。
  • 我在调用 save 之前显示了对象,Product [productId=p110, timeStamp=1588426591, description=butter, name=amul, MRP=0.0, quantity=8, Promotion=5.0]
  • @MadhumitaGangaS 好的,所以它甚至没有在插入时设置。我会尝试使用一致的 MRP 拼写/大小写,因为现在它有时大写,有时小写,然后在 json 中它只有 m 小写。这可能是 Spring Data JPA 的问题。
猜你喜欢
  • 2016-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多