【问题标题】:@Column(nullable=false) Not Working@Column(nullable=false) 不工作
【发布时间】:2014-09-09 09:45:01
【问题描述】:

我已经启动了一个 Struts 和 Hibernate 集成项目。 我有一个专栏firstname as

@Column(name="FirstName", length=15, nullable=false)
public String getFirstName() {
  return firstname;
}

firstname 是 POJO 中的参数,其值来自 Struts 表单。

问题是在提交表单时,firstname的空值存储在db中。

【问题讨论】:

  • 你知道null和空字符串不是一回事吧?
  • Null 和“空值”在许多数据库中不是一回事。例如,Oracle 数据库将 NULL 和 '' 视为相同,而 MS SQL 将 NULL 和 "" 视为不同。检查您使用的数据库的概念。
  • 表单中的空值意味着 FIRSTNAME 不是 null ,它是一个空白字符串。所以DB不给任何例外。
  • 覆盖 validate 方法并使用 commons-validator 或其他类似 JSR-303 来防止输入空字符串。之后,您可以阻止它们存储在数据库中。
  • 是的,Oracle 违反了 ANSI 标准,将 null 和空字符串视为同一事物。我不知道有任何其他数据库有相同的错误。

标签: java hibernate struts2 jpa-2.0 pojo


【解决方案1】:

你可以轻松解决问题

public void setFirstName(String firstName) {
  if (firstName != null && firstName.isEmpty())
    this.firstName = null;
  else
    this.firstName = firstName;
} 

在计算机科学中,persistence 是指系统状态的特征,它比创建它的进程寿命更长(持续时间更长)。这实际上是通过将状态作为数据存储在计算机数据存储中来实现的。

这个规则的例外是一个不受约束影响的空字符串,因此应该在数据被持久化之前固定在某个地方。因为这在客户端不是问题,但在服务器端,注释确实 not 检查在会话关闭之前修改的数据的状态。在这种情况下会抛出 SQL 异常。

这不是验证的主题。如果它是第一次在服务器上的 Struts 应用程序,则它由 Struts 验证。 Struts 可以从表单中删除空参数,但它需要额外的配置设置。 Struts 可以使用类型转换将空字符串属性转换为null

它可以使用使用 Struts 的内置验证器。正如我所说,如何处理来自请求的空字符串不是问题,而是如何修复它。什么数据库处理空值无关紧要,但问题只是休眠存储在数据库中的空字符串值。

【讨论】:

  • 这不是问题的正确答案。 nullable = false 必须在持久化之前检查值并导致异常
  • @Daniele “在计算机科学中,persistence 是指系统状态的特征,它比创建它的过程长(持久)。这是在实践中实现的通过将状态作为数据存储在计算机数据存储中。”这个规则的例外是一个不受约束影响的空字符串,因此应该在数据被持久化之前固定在某个地方。由于这在客户端不是问题,但在服务器端,注释不会检查在会话关闭之前修改的数据的状态。这种情况下会抛出 SQL 异常。
  • 我试过了,正确的反应是使用 javax.validation.@NotNull 注释。这个注解被 hibernate 拦截来检查和验证一个非空值插入/更新到表中。
  • @Daniele 这不是验证的主题。如果它是第一次在服务器上的 Struts 应用程序,则它由 Struts 验证。 Struts 可以从表单中删除 empty 参数,但它需要额外的配置设置。 Struts 可以使用类型转换 将空字符串属性转换为null。它可以使用使用 Struts 的内置验证器。正如我所说,如何处理来自请求的空字符串不是问题,而是如何修复它。什么数据库处理空值无关紧要,但问题仅在于hibernate存储在数据库中的空字符串值。
  • 这里的Struts超出了范围,这不是问题的问题。该问题涉及休眠和数据库问题,来自提交的表单的内容超出了范围。
【解决方案2】:

添加休眠属性

javax.persistence.validation.mode=none

【讨论】:

    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 2018-01-08
    • 2011-02-23
    • 2013-02-17
    • 2011-03-20
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多