给定以下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
。
自动生成架构时,precision
和scale
属性是否需要BigDecimal
列?
原因是,根据JDBC规范bigdecimal映射为数字。未经指定刻度的默认比例为0。
数字(38)(或在诸如Oracle编号(38)之类的数据库中)是数据库中此数据类型的最大值:
38 significant digits in the range of -(10**125) to +(10**125).