NullPointerException при использовании функции getName() из SingularAttribute

Когда я вызываю метод getName класса SingularAttribute, я получаю исключение nullpointerexception. Я застрял здесь на пару часов, и на всю жизнь я не могу понять, почему это происходит, поэтому я решил попросить вас подумать над этим вопросом. Я предполагаю, что где-то мои аннотации неверны, или что я пропускаю шаг при создании моих автоматически сгенерированных исходных файлов.

Это пример звонка, который я делаю:

SingularAttribute attribute = criteria.getAttribute();
if( attribute == null )
    System.out.println("Attribute is null");
else
    System.out.println(attribute.getName());

Вот исключение, это происходит при вызове attribute.getName():

Exception in thread "main" java.lang.NullPointerException
at org.eclipse.persistence.internal.jpa.metamodel.proxy.AttributeProxyImpl.getName(AttributeProxyImpl.java:73)
at test.core.Test.main(Main.java:47)

У меня есть автоматически сгенерированные исходные файлы, которые содержат данные метамодели моих сущностей. Вот пример моей сущности и моей метамодели:

@Entity
@Table(name = "cards")
public class Card {
    @Column(unique = true)
    private String name;
}

@Generated(value="EclipseLink-2.6.0.v20140809-rNA", date="2015-01-07T09:16:03")
@StaticMetamodel(Card.class)
public class Card_ {
    public static volatile SingularAttribute<Card, String> name;
}

Вот мой класс Критерии:

public class Criteria<T,U extends Serializable> {
    private final SingularAttribute<? super T, U> attribute;

    private final U parameter;

    private final CriteriaOperator operator;

    Criteria(SingularAttribute<? super T, U> attribute, U parameter, CriteriaOperator operator) {
        this.attribute = attribute;
        this.parameter = parameter;
        this.operator = operator;
    }

    public static enum CriteriaOperator{
        AND,OR,NOT;
    }

    public SingularAttribute<? super T, U> getAttribute() {
        return attribute;
    }

    public U getParameter() {
        return parameter;
    }

    public CriteriaOperator getOperator() {
        return operator;
    }
}

Здесь я создаю новый экземпляр класса критериев

33 public static void main(String[] args) {
34  
35  Criteria<Card, String> criteria = new Criteria<Card, String>(Card_.name, "test", CriteriaOperator.AND);
36  
37  if (criteria == null) {
38      System.out.println("Criteria is null");
39  } else {
40      System.out.println(criteria.getOperator().name());
41      
42      SingularAttribute<? super Card, String> attribute = criteria.getAttribute();
43      if( attribute == null )
45          System.out.println("Attribute is null");
46      else
47          System.out.println(attribute.getName());
48      
49      System.out.println(criteria.getParameter().toString());
50  }
51  
52 }

Редактировать 1: Удалены компоненты графического интерфейса, чтобы сделать пример более тривиальным, включая основную функцию, которая создает экземпляр класса критериев.

1 ответ

Решение

Очевидно, что соединение с моей БД должно быть открыто для успешного вызова attribute.getName(). как только я создал экземпляр EntityManagerFactory и EntityManager, вызов работает. Как только эти две строки удалены, вызов не выполняется.

Другие вопросы по тегам