2009-03-25 4 views
1

Две таблицы, первичный ключ одной является внешним ключом другого (Наследие БД)
Я использовал двунаправленную один к одному отображения:Почему я получаю это исключение 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 

+0

При запуске чего? Можете ли вы предоставить код, который вы используете? И трассировка стека? –

+0

Можете ли вы разместить код для Persistence.createEntityManagerFactory? Кроме того, вы уверены, что хотите, чтобы имя класса являлось Presister? Убедитесь, что это так, как вы пишете его повсюду. – mandaleeka

+0

Persistence.createEntityManagerFactory находится в javax.persistence.Persistence. И Presister не называется где-то там, где он просто содержит «главную» – Moro

ответ

1

Возможно, вы захотите взглянуть на второй пример в 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; 
} 
+0

Хотя он работает, но, как я понимаю, я думаю, что JPA будет использовать столбец id в First is Foreign key для PK во втором и наоборот ... Так что u не использовал атрибут mappedBy, чтобы идентифицировать владельца отношений. Thanx – Moro

Смежные вопросы