EclipseLink 自动为 H2 数据库生成 Integer 而不是 Decimal

EclipseLink auto generates Integer instead of Decimal for H2 database

给定以下 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 属性?

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

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

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