【问题标题】:EclipseLink auto generates Integer instead of Decimal for H2 databaseEclipseLink 自动为 H2 数据库生成整数而不是小数
【发布时间】:2018-05-09 03:21:42
【问题描述】:

给定以下 JPA 实体:

@Table(name = "T_BOOK")
@Entity
@NamedQueries({
        @NamedQuery(name = Book.FIND_BY_ISBN_QUERY.QUERY_NAME, query = Book.FIND_BY_ISBN_QUERY.QUERY_STRING)
})
public class Book extends BaseEntity {

    public static class FIND_BY_ISBN_QUERY {
        public static final String QUERY_NAME = "Book.findByISBN";
        public static final String QUERY_STRING = "select new ch.bfh.eadj.dto.BookInfo(b.isbn, b.authors, b.title, b.price) from Book b where b.isbn = :isbn";
    }

    @Column(nullable = false)
    private String isbn;

    private String authors;

    @Column(nullable = false)
    private String title;

    @Column(nullable = false)
    private BigDecimal price;

架构生成创建以下创建语句:

CREATE TABLE T_BOOK (NR BIGINT IDENTITY NOT NULL, AUTHORS VARCHAR, BINDING VARCHAR,ISBN VARCHAR NOT NULL, PRICE NUMERIC(38) NOT NULL, TITLE VARCHAR NOT NULL, VERSION INTEGER, PRIMARY KEY (NR))

所以价格字段看起来像这样:PRICE NUMERIC(38) NOT NULL

为什么EclipseLink 会创建一个非十进制数值?

只要我将@Column(precision = 8, scale = 2) 添加到price 字段,它就会按预期工作并创建PRICE NUMERIC(8,2) NOT NULL

自动生成架构时是否需要 BigDecimal 列上的 precisionscale 属性?

【问题讨论】:

  • H2 创建 JPA 提供者要求创建的内容。想知道你使用的是哪一个
  • 感谢您的提示。将提供者添加到问题中。这是EclipseLink
  • 默认情况下,EclipseLink 持久性提供程序会自动为简单类型配置基本映射。如果您使用如下注解:@Column@Basic 等,您可以微调您的映射。

标签: database jpa jakarta-ee eclipselink h2


【解决方案1】:

原因是根据 JDBC 规范 BigDecimal 映射到数字。 如果不指定比例,则默认比例为 0。

NUMERIC(38)(或在 oracle 等数据库中的 NUMBER(38))是数据库中此数据类型的最大值:

38 significant digits in the range of -(10**125) to +(10**125).

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2011-11-08
    • 2020-06-20
    • 2021-05-08
    • 2015-09-17
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多