BigDecimal 的 JPA @Size 注释

Posted

技术标签:

【中文标题】BigDecimal 的 JPA @Size 注释【英文标题】:JPA @Size annotation for BigDecimal 【发布时间】:2014-01-21 09:00:15 【问题描述】:

如何为 mysql DECIMAL(x,y) 列使用 @Size 注释?

我正在使用BigDecimal,但是当我尝试包含@Size max 时,它不起作用。这是我的代码:

@Size(max = 7,2)
@Column(name = "weight")
private BigDecimal weight;

【问题讨论】:

【参考方案1】:
@Column(columnDefinition = "DECIMAL(7,2)")

如果您询问应该如何验证,您应该使用@Min 和@Max 注释或@DecimalMin 和@DecimalMax 注释。

@Size 是用于验证属性的注释,而不是定义其列。 @Size 通常用于确保字符串或集合具有一定的大小。

【讨论】:

那么我将如何使用@Max 来验证BigDecimal7,2 @Threat 当你说“用 7,2 验证 BigDecimal”时......你能澄清一下吗?当我读到这篇文章时,我假设您说的是具有特定比例和精度的 BigDecimal,这与最小值和最大值不同。 换句话说,我的BigDecimal 必须符合例如9999999,99 最大值。据我了解,与 MySQL 验证它的方式相同。 @ThreaT,DECIMAL(7,2)表示共7位,其中小数点后2位。所以它可以容纳的最大值是99999,99 它向我抛出 SQL 错误:0,SQLState:22003,错误:数字字段溢出。 source 是 BigDecimal 字段。我试图把@Column(columnDefinition = "DECIMAL(8,8)") 放过来,所以我还需要发现更多的东西。【参考方案2】:

您可以直接使用 Hibernate Validator,并使用 @Digits 注释您的字段,如下所示:

@Digits(integer=5, fraction=2)
@Column(name = "weight")
private BigDecimal weight;

【讨论】:

TopLink 的javax.persistence_1.0.0.0_1-0-2.jar 也可以使用吗? 验证是一个独立于 JPA 的 API。因此,当您尝试通过persist() 持久化实体时不会出现错误,例如,您必须自己进行验证 我如何自己进行验证?是否有指向 Oracle 网站的链接,我可以在那里阅读更多信息? 我的意思是,在尝试保存到数据库之前,应该在视图层进行验证。如果您使用 JSF,请参阅docs.oracle.com/javaee/6/tutorial/doc/gircz.html,或者如果您使用 Spring,请参阅此处docs.spring.io/spring/docs/3.2.x/spring-framework-reference/… Java EE 7: docs.oracle.com/javaee/7/tutorial/doc/… 看起来@DecimalMax 是要使用的注解?【参考方案3】:

见this answer

@Column(nullable= false, precision=7, scale=2)    // Creates the database field with this size.
@Digits(integer=9, fraction=2)                    // Validates data when used as a form
private BigDecimal myField;

【讨论】:

我认为应该是@Column(nullable= false, precision=9, scale=2) 和@Digits(integer=7, fraction=2)

以上是关于BigDecimal 的 JPA @Size 注释的主要内容,如果未能解决你的问题,请参考以下文章

BigDecimal,精度和规模

JPA @Column 注释以创建注释/描述

如何从 JPA 注释的实体类生成 JPA 映射文件?

JPQL 查询:选择一个布尔值,它是对象的两个字段的 AND

Hibernate @LazyToOne 注释的 JPA 等价物是啥?

java.math.BigDecimal是啥意思