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


当前回答

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

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

其他回答

我使用columnDefinition,它工作得很好

@Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP")

private Date createdDate;

这在JPA中是不可能的。

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

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

当您在插入数据时在数据库中设置默认约束时,@Column(columnDefinition='…')不工作。 你需要使insertable = false并删除columnDefinition='…’,那么数据库将自动从数据库中插入默认值。 例如,当你在数据库中设置varchar时,性别默认为男性。 你只需要在Hibernate/JPA中添加insertable = false,它就可以工作了。

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