是否可以为JPA中的列设置默认值,如果可以,如何使用注释来完成?


当前回答

可以在数据库设计器中定义默认值,也可以在创建表时定义。例如,在SQL Server中,您可以将Date字段的默认库设置为(getDate())。如列定义中所述,使用insertable=false。JPA不会在插入时指定该列,数据库将为您生成该值。

其他回答

您可以执行以下操作:

@Column(name="price")
private double price = 0.0;

在那里!您只是使用了0作为默认值。

注意,如果您只从该应用程序访问数据库,则此方法将适用。如果其他应用程序也使用该数据库,那么您应该使用Cameron的columnDefinition注释属性或其他方式从数据库进行检查。

实际上,这在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;

当然,这个选项不会设置数据库中的默认列值。

你可以使用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注释都不支持默认列值的概念。作为解决这个限制的一种方法,在对会话调用Hibernate save()或update()之前设置所有默认值。这尽可能地(除了Hibernate设置默认值之外)模拟了数据库在保存表中的一行时设置默认值的行为。

与此备选答案所建议的在模型类中设置默认值不同,此方法还确保使用Example对象作为搜索原型的条件查询将继续像以前一样工作。当您在模型类中设置一个可为空的属性(具有非基本类型的属性)的默认值时,Hibernate示例查询将不再忽略相关的列,以前它会因为它为空而忽略它。