java - Hibernate 默认 varchar 值 - Postgres

标签 java hibernate postgresql

我有一个用 Hibernate 映射的 Postgres 数据库,一切都工作正常,直到我需要添加新属性。 我添加了一个属性“ROLE”,该属性必须不为空,并且默认值为“USER”。 在 Postgres 中,我有 ROLE VARCHAR(60) NOT NULL DEFAULT 'USER' 我相信这是正确的,而且我也有

@Column(name = "role", length = 60, nullable = false, columnDefinition = "varchar(60) default 'USER'")
public String getRole() {
    return this.role;
}

问题是,当我尝试在数据库中创建新条目时,它失败了 - not-null 属性引用了 null 或 transient 值

我已经尝试了一切,但没有运气......从我读到的内容来看,我所拥有的应该有效。 有人可以帮忙吗?

谢谢。

最佳答案

在大多数情况下,如果您只需将角色设置为默认值,就应该可以解决问题。

否则它将被设置为 null,因为 this.role 在保存期间将为 null,因此该值将被持久化。

  • 默认值作为字段的初始值:

    private String role = "USER";
    
  • 在保存期间使用 org.hibernate.usertype.UserType 并覆盖 null:

    @Override
    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException
    {
        if (value == null)
            st.setString(index, "ROLE");
        else
            st.setString(index, s);
    }
    
  • 使用 @PrePersist@PreUpdate 方法并通过以下方式设置默认值:

    if (this.role == null) { this.role = "USER"; }
    

如果您从外部获取该值设置为 null 的对象(例如反序列化的 JSON 或 XML),您可能需要使用 @PrePersistUserType,否则只需设置默认值值应该没问题。

  • 您可以使用 Hibernate 动态更新语句 dynamic-update=truedynamic-insert=true。它为每个不插入空值的插入生成插入语句,因此使用数据库默认值。

关于java - Hibernate 默认 varchar 值 - Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24627996/

相关文章:

java - HikariPool-1 - 无法执行连接的 isValid(),配置连接测试查询 (oracle.jdbc.driver.T4CConnection.isValid(I)Z)

java - com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException : No operations allowed after connection closed

sql - 从 PostgreSQL 将包含换行符的数据导出为 CSV

java - 为什么在这个递归线程示例中 Activity 线程数没有超过 3?

java - 未调用 Jersey ExceptionMapper

hibernate - Grails域映射异常

postgresql - 多列索引中的 boolean 列

postgresql - 使用 dblink 更新列

java - 如何从 java.util.HashMap 转换为 android.content.ContentValues?

java - base64 java中的失败编码文件