是否可以为JPA中的列设置默认值,如果可以,如何使用注释来完成?
当前回答
你可以使用Java反射api:
@PrePersist
void preInsert() {
PrePersistUtil.pre(this);
}
这很常见:
public class PrePersistUtil {
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public static void pre(Object object){
try {
Field[] fields = object.getClass().getDeclaredFields();
for(Field field : fields){
field.setAccessible(true);
if (field.getType().getName().equals("java.lang.Long")
&& field.get(object) == null){
field.set(object,0L);
}else if (field.getType().getName().equals("java.lang.String")
&& field.get(object) == null){
field.set(object,"");
}else if (field.getType().getName().equals("java.util.Date")
&& field.get(object) == null){
field.set(object,sdf.parse("1900-01-01"));
}else if (field.getType().getName().equals("java.lang.Double")
&& field.get(object) == null){
field.set(object,0.0d);
}else if (field.getType().getName().equals("java.lang.Integer")
&& field.get(object) == null){
field.set(object,0);
}else if (field.getType().getName().equals("java.lang.Float")
&& field.get(object) == null){
field.set(object,0.0f);
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
其他回答
我尝试了一些JPA/ hibernate的方法,但没有一个似乎工作得很好。由于我使用Oracle,我创建了一个“之前的触发器”,在触发器中一个简单的空测试,然后如果空集根据需要
您可以执行以下操作:
@Column(name="price")
private double price = 0.0;
在那里!您只是使用了0作为默认值。
注意,如果您只从该应用程序访问数据库,则此方法将适用。如果其他应用程序也使用该数据库,那么您应该使用Cameron的columnDefinition注释属性或其他方式从数据库进行检查。
当您在插入数据时在数据库中设置默认约束时,@Column(columnDefinition='…')不工作。 你需要使insertable = false并删除columnDefinition='…’,那么数据库将自动从数据库中插入默认值。 例如,当你在数据库中设置varchar时,性别默认为男性。 你只需要在Hibernate/JPA中添加insertable = false,它就可以工作了。
实际上,这在JPA中是可能的,尽管使用@Column注释的columnDefinition属性有点hack,例如:
@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")
JPA不支持这一点,如果支持的话会很有用。使用columnDefinition是特定于db的,在许多情况下是不可接受的。在检索具有空值的记录时(通常在重新运行旧的DBUnit测试时发生),在类中设置默认值是不够的。我所做的是:
public class MyObject
{
int attrib = 0;
/** Default is 0 */
@Column ( nullable = true )
public int getAttrib()
/** Falls to default = 0 when null */
public void setAttrib ( Integer attrib ) {
this.attrib = attrib == null ? 0 : attrib;
}
}
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