hibernate实体中的必选字段



我有一个Person bean,需要ssngender作为必填字段

@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
    ...
    }
}

如果您想在运行时这样做,唯一的方法是使用反射(当您掌握它的窍门时,它实际上非常有趣!)。像下面这样一个简单的实用方法就可以做到:

/**
 * 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)

请注意,并不是所有的注释都在运行时可用——这取决于它们的保留策略。如果@NotNullRUNTIME的保留策略,那么没问题,否则你必须在编译时做一些事情。

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

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

  // 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

相关内容

  • 没有找到相关文章

最新更新