是否可以为JPA中的列设置默认值,如果可以,如何使用注释来完成?
当前回答
实际上,这在JPA中是可能的,尽管使用@Column注释的columnDefinition属性有点hack,例如:
@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")
其他回答
我使用columnDefinition,它工作得很好
@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private Date createdDate;
我尝试了一些JPA/ hibernate的方法,但没有一个似乎工作得很好。由于我使用Oracle,我创建了一个“之前的触发器”,在触发器中一个简单的空测试,然后如果空集根据需要
这在JPA中是不可能的。
下面是您可以使用Column注释执行的操作:http://java.sun.com/javaee/5/docs/api/javax/persistence/Column.html
我找到了另一种方法来解决同样的问题,因为当我创建自己的对象并在数据库中持久化时,不尊重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类成员来替代。
推荐文章
- Intellij IDEA Java类在保存时不能自动编译
- 何时使用Mockito.verify()?
- 在maven中安装mvn到底做什么
- 不可变与不可修改的集合
- 如何在JSON中使用杰克逊更改字段名
- GSON -日期格式
- 如何从线程捕获异常
- 无法解析主机"<URL here>"没有与主机名关联的地址
- 如何在Java中打印二叉树图?
- String.format()在Java中格式化双重格式
- com.jcraft.jsch.JSchException: UnknownHostKey
- Java中的操作符重载
- 如何加速gwt编译器?
- 在Hibernate中重新连接分离对象的正确方法是什么?
- 应该……接住环内还是环外?