【问题标题】:restrict length of number column using jpa使用 jpa 限制数字列的长度
【发布时间】:2018-02-14 22:38:02
【问题描述】:

我想在 oracle 中生成一个列 (abc NUMBER(2))(目前):

@Column(length = 2)
private Integer abc;

但仍然在 Oracle 中,创建的列是 abc NUMBER(10, 0)

我试过@Digits(integer=2, fraction=0),但我认为这不起作用,因为Java类型是Integer

@Digit 的 Java 文档说:

注释元素必须是可接受范围内的数字支持 类型是:

BigDecimal
BigInteger
String
byte, short, int, long, and their respective wrapper types

null 元素被认为是有效的

但是@Digits(integer=2, fraction=0)对生成的列没有影响。

我正在寻找一个通用的解决方案,它也可以在 MySQL 上运行。

【问题讨论】:

  • Digit 注释仅用于验证数据,并要求验证器实现在值与定义的值不匹配时抛出异常。它与 JPA 无关,与数据库中的 DDL 生成无关。如果您在数据库中查找特定类型,则必须使用 columnDefinition 自己定义它。如果它不能在不同的数据库平台上运行,你就会被卡住——你必须在 orm.xml 中覆盖它,并为你的数据库提供细节。

标签: java oracle jpa


【解决方案1】:

你可以试试java-sql数据类型映射得到的精度

@Column
private Short weightedScore;

也试试BigDecimal 指定precisionscale

@Column(precision = 2, scale = 0)
private BigDecimal weightedScore;

恕我直言,BigDecimal precision 与 Oracle NUMBER(precision) 的映射非常好。

使用precision属性,即

@Column(precision=2)
private Integer abc;

我希望它会生成一些 DDL,例如 NUMBER(2,0)

How to specify Double's precision on hibernate?

【讨论】:

  • 但我认为mysql没有NUMBER。因此,这可能仅限于 oracle。 dev.mysql.com/doc/refman/5.7/en/numeric-types.html
  • 没有你提到的问题MySQL 。 @MohammadFaisal
  • 所以也许是@Column(precision=2)。答案已更新
  • 精度属性仅在使用小数列时适用。如您在答案中添加的链接中所述。
  • 但是使用@Digits(integer=5,fraction=2) 可以在BigDecimal 上工作,生成的列是NUMBER(7,2)。我可以考虑Short。我还需要改变什么吗?
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
相关资源
最近更新 更多