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


当前回答

另一种方法是使用javax.persistence.PrePersist

@PrePersist
void preInsert() {
   if (this.createdTime == null)
       this.createdTime = new Date();
}

其他回答

你可以使用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();
            }
        }
    }

鉴于我在试图解决相同的问题时无意中从谷歌中发现了这个问题,我只是要抛出我炮制的解决方案,以防有人发现它有用。

在我看来,这个问题只有一种解决方案——@PrePersist。如果你在@PrePersist中这样做,你必须检查这个值是否已经设置了。

我找到了另一种方法来解决同样的问题,因为当我创建自己的对象并在数据库中持久化时,不尊重DDL的默认值。

因此,我查看了控制台,生成了SQL,并看到所有字段都有插入,但对象中只有一个属性的值发生了变化。

我在模型类中放了这个annotation。

@DynamicInsert

插入数据时,框架不会插入空值或未修改的值,从而使插入更短。

也有@DynamicUpdate注释。

列注释不能这样做。我认为唯一的方法是在创建对象时设置默认值。也许默认构造函数是这样做的正确位置。

这在JPA中是不可能的。

下面是您可以使用Column注释执行的操作:http://java.sun.com/javaee/5/docs/api/javax/persistence/Column.html