是否可以为JPA中的列设置默认值,如果可以,如何使用注释来完成?
当前回答
另一种方法是使用javax.persistence.PrePersist
@PrePersist
void preInsert() {
if (this.createdTime == null)
this.createdTime = new Date();
}
其他回答
JPA和Hibernate注释都不支持默认列值的概念。作为解决这个限制的一种方法,在对会话调用Hibernate save()或update()之前设置所有默认值。这尽可能地(除了Hibernate设置默认值之外)模拟了数据库在保存表中的一行时设置默认值的行为。
与此备选答案所建议的在模型类中设置默认值不同,此方法还确保使用Example对象作为搜索原型的条件查询将继续像以前一样工作。当您在模型类中设置一个可为空的属性(具有非基本类型的属性)的默认值时,Hibernate示例查询将不再忽略相关的列,以前它会因为它为空而忽略它。
我使用columnDefinition,它工作得很好
@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private Date createdDate;
另一种方法是使用javax.persistence.PrePersist
@PrePersist
void preInsert() {
if (this.createdTime == null)
this.createdTime = new Date();
}
我找到了另一种方法来解决同样的问题,因为当我创建自己的对象并在数据库中持久化时,不尊重DDL的默认值。
因此,我查看了控制台,生成了SQL,并看到所有字段都有插入,但对象中只有一个属性的值发生了变化。
我在模型类中放了这个annotation。
@DynamicInsert
插入数据时,框架不会插入空值或未修改的值,从而使插入更短。
也有@DynamicUpdate注释。
@Column(columnDefinition="tinyint(1) default 1")
我刚刚测试了这个问题。它工作得很好。谢谢你的提示。
关于评论:
@Column(name="price")
private double price = 0.0;
当然,这个选项不会设置数据库中的默认列值。
推荐文章
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- Mockito.any()传递带有泛型的接口
- 在IntelliJ 10.5中运行测试时,出现“NoSuchMethodError: org.hamcrest. matcher . descripbemismatch”
- 使用String.split()和多个分隔符
- Java数组有最大大小吗?
- 在Android中将字符串转换为Uri
- 从JSON生成Java类?
- 为什么java.util.Set没有get(int index)?
- Swing和AWT的区别是什么?
- 为什么Java流是一次性的?
- 四舍五入BigDecimal *总是*有两位小数点后
- 设计模式:工厂vs工厂方法vs抽象工厂
- Java:检查enum是否包含给定的字符串?
- 它的意思是:序列化类没有声明一个静态的最终serialVersionUID字段?