是否可以为JPA中的列设置默认值,如果可以,如何使用注释来完成?
当前回答
鉴于我在试图解决相同的问题时无意中从谷歌中发现了这个问题,我只是要抛出我炮制的解决方案,以防有人发现它有用。
在我看来,这个问题只有一种解决方案——@PrePersist。如果你在@PrePersist中这样做,你必须检查这个值是否已经设置了。
其他回答
当您在插入数据时在数据库中设置默认约束时,@Column(columnDefinition='…')不工作。 你需要使insertable = false并删除columnDefinition='…’,那么数据库将自动从数据库中插入默认值。 例如,当你在数据库中设置varchar时,性别默认为男性。 你只需要在Hibernate/JPA中添加insertable = false,它就可以工作了。
实际上,这在JPA中是可能的,尽管使用@Column注释的columnDefinition属性有点hack,例如:
@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")
@Column(columnDefinition="tinyint(1) default 1")
我刚刚测试了这个问题。它工作得很好。谢谢你的提示。
关于评论:
@Column(name="price")
private double price = 0.0;
当然,这个选项不会设置数据库中的默认列值。
我找到了另一种方法来解决同样的问题,因为当我创建自己的对象并在数据库中持久化时,不尊重DDL的默认值。
因此,我查看了控制台,生成了SQL,并看到所有字段都有插入,但对象中只有一个属性的值发生了变化。
我在模型类中放了这个annotation。
@DynamicInsert
插入数据时,框架不会插入空值或未修改的值,从而使插入更短。
也有@DynamicUpdate注释。
在2017年,JPA 2.1仍然只有@Column(columnDefinition='…'),您可以将列的文字SQL定义放在其中。这是相当不灵活的,并迫使您还声明其他方面,如类型,从而缩短了JPA实现在这方面的视图。
Hibernate有这个:
@Column(length = 4096, nullable = false)
@org.hibernate.annotations.ColumnDefault("")
private String description;
标识通过DDL应用到关联列的DEFAULT值。
Hibernate 4.3文档(4.3是为了显示它已经存在很长时间了) 数据库列的默认值为Hibernate手册
两点注意事项:
1) Don't be afraid of going non-standard. Working as a JBoss developer, I've seen quite some specification processes. The specification is basically the baseline that the big players in given field are willing to commit to support for the next decade or so. It's true for security, for messaging, ORM is no difference (although JPA covers quite a lot). My experience as a developer is that in a complex application, sooner or later you will need a non-standard API anyway. And @ColumnDefault is an example when it outweigts the negatives of using a non-standard solution.
2)每个人都挥动@PrePersist或构造函数成员初始化的方式很好。但这不是一回事。批量SQL更新怎么样?不设置列的语句呢?DEFAULT有它自己的角色,不能通过初始化Java类成员来替代。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap