我有一个用 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),您可能需要使用 @PrePersist
或 UserType
,否则只需设置默认值值应该没问题。
- 您可以使用 Hibernate 动态更新语句
dynamic-update=true
和dynamic-insert=true
。它为每个不插入空值的插入生成插入语句,因此使用数据库默认值。
关于java - Hibernate 默认 varchar 值 - Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24627996/