hibernate实体中的必填字段

时间:2011-12-12 10:35:54

标签: java hibernate reflection

我有一个 bean,需要 ssn 性别作为必填字段

@Entity
public class Person {
    @Id
    private Long id;
    @NotNull
    private String ssn;//This is mandatory
    @NotNull
    private Gender gender;//This is mandatory
    private String firstname;
    private Date dateOfBirth;
    ...
}

我在MandatoryFieldsFinder类中无法访问person对象,有没有办法在运行时在hibernate中查找这些必填字段或使用反射?我是一个反思的完全新手,不想使用它。

public class MandatoryFieldsFinder{

    public list getAllMandatoryFieldsFromPerson(){
    ....
    //I need to find the mandatory fields in Person class here
    ...
    }
}

2 个答案:

答案 0 :(得分:1)

如果你想在运行时这样做,唯一的方法是使用反射(当你掌握它时,它实际上非常有趣!)。像下面这样的简单实用方法应该这样做:

/**
 * Gets a List of fields from the class that have the supplied annotation.
 * 
 * @param clazz
 *            the class to inspect
 * @param annotation
 *            the annotation to look for
 * @return the List of fields with the annotation
 */
public static List<Field> getAnnotatedFields(Class<?> clazz,
        Class<? extends Annotation> annotation) {

    List<Field> annotatedFields = new ArrayList<Field>();

    for (Field field : clazz.getDeclaredFields()) {
        if (field.isAnnotationPresent(annotation)) {
            annotatedFields.add(field);
        }
    }

    return annotatedFields;

}

然后,您可以使用以下方法实施getAllMandatoryFieldsFromPerson()方法:

getAnnotatedFields(MyClass.class, NotNull.class)

但请注意,并非所有注释都在运行时可用 - 这取决于他们的retention policy。如果@NotNull的保留政策为RUNTIME,那就没关系,否则您必须在编译时执行某些操作。

我很感兴趣为什么你首先需要这些信息 - 这通常是JSR303 bean验证会为你处理的事情。

答案 1 :(得分:0)

您可以在字段上查询注释的存在:

  // walk through fields
    for (Field field : extractFields(target)) {

        final InjectView annotation = field.getAnnotation(InjectView.class);
        if (annotation != null) {

......做任何必要的事             }         }

https://github.com/ko5tik/andject/blob/master/src/main/java/de/pribluda/android/andject/ViewInjector.java