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
列上的 precision
和 scale
属性?
原因是根据 JDBC 规范,BigDecimal 映射到数字。
如果不指定比例,则默认比例为 0。
NUMERIC(38)(或在像 oracle NUMBER(38) 这样的数据库中)是数据库中此数据类型的最大值:
38 significant digits in the range of -(10**125) to +(10**125).
给定以下 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
列上的 precision
和 scale
属性?
原因是根据 JDBC 规范,BigDecimal 映射到数字。 如果不指定比例,则默认比例为 0。
NUMERIC(38)(或在像 oracle NUMBER(38) 这样的数据库中)是数据库中此数据类型的最大值:
38 significant digits in the range of -(10**125) to +(10**125).