Почему я получаю это исключение NullPointer?

Две таблицы, первичный ключ одной из которых является внешним ключом другой (устаревшая БД)
Я использовал двунаправленное сопоставление один к одному:

@Entity
public class First {
    @Id protected int a;

    @OneToOne(mappedBy ="first", cascade = CascadeType.PERSIST)
    @JoinColumn(name = "a")
    protected Second second;
}


@Entity
public class Second {

    @Id protected int a;

    @OneToOne
    @JoinColumn(name = "a", insertable = false)
    First first;
}

Проблема при запуске:

public class Persister {

    public static void main(String[] args) {

        EntityManagerFactory aEntityManagerFactory;
        EntityManager aEntityManager;       
        aEntityManagerFactory =
                       Persistence.createEntityManagerFactory("bibit_notification_jpa");
        aEntityManager = aEntityManagerFactory.createEntityManager();

        Second aSecond = new Second();
        aSecond.a = 1;          

        First aFirst = new First();
        aFirst.a = 1;
        aFirst.second = aSecond;

        aEntityManager.getTransaction().begin();
        aEntityManager.persist(aFirst);
        aEntityManager.getTransaction().commit();

      }}

, он выдает это исключение:

Exception in thread "main" javax.persistence.PersistenceException: java.lang.NullPointerException
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:252)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:120)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
    at Persister.main(Persister.java:14)
Caused by: java.lang.NullPointerException
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115)
    at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1233)
    at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:154)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:869)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:183)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:240)
    ... 4 more


person Moro    schedule 25.03.2009    source источник
comment
При запуске чего? Можете ли вы предоставить код, который вы используете? А трассировка стека?   -  person Pablo Santa Cruz    schedule 25.03.2009
comment
Можете ли вы опубликовать код для Persistence.createEntityManagerFactory? Кроме того, вы уверены, что хотите, чтобы имя класса было Presister? Убедитесь, что вы везде пишете именно так.   -  person mandaleeka    schedule 25.03.2009
comment
Persistence.createEntityManagerFactory находится в javax.persistence.Persistence. И Presister не называется там, где он просто содержит main   -  person Moro    schedule 25.03.2009
comment
Может быть, если бы это была сестра, а не пресестер, это бы сработало... ;)   -  person Don Branson    schedule 25.03.2009
comment
А если серьезно, где 14-я строка в Presister? Это было бы хорошо знать.   -  person Don Branson    schedule 25.03.2009
comment
ха-ха... кому здесь интересно???????   -  person Moro    schedule 25.03.2009
comment
У меня была аналогичная проблема. После обновления Hibernate Annotations проблема осталась, но сообщение об ошибке стало полезным. Это помогло мне решить мою проблему с отображением, о которой я не знал.   -  person André Chalella    schedule 11.09.2009


Ответы (2)


Этот пост: http://forum.hibernate.org/viewtopic.php?t=970823)

Кажется, это указывает на какую-то проблему с аннотациями 3.2.x. Какую версию ты используешь? Если это 3.2.x, попробуйте 3.3 или 3.4.

person Don Branson    schedule 25.03.2009

Вы можете взглянуть на второй пример в JavaDoc. Если я правильно прочитал, код должен быть

@Entity
public class First {
    @Id protected int a;

    @OneToOne @PrimaryKeyJoinColumn
    protected Second second;
}

@Entity
public class Second {

    @Id protected int a;

    @OneToOne @PrimaryKeyJoinColumn
    First first;
}
person David Rabinowitz    schedule 29.03.2009
comment
Хотя это сработало, но, как я понимаю, я думаю, что JPA будет предполагать, что столбец id в первом является внешним ключом для PK во втором и наоборот ... Так что вы не использовали атрибут mappedBy для идентификации владельца отношения. спасибо - person Moro; 02.04.2009