【问题标题】:Why am I getting this NullPointer exception?为什么我会收到此 NullPointer 异常?
【发布时间】:2010-10-15 11:35:01
【问题描述】:

两张表,一张的主键是另一张的外键(旧版数据库)
我使用了双向的一对一映射:

@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();

      }}

,它会抛出这个异常:

线程“主”javax.persistence.PersistenceException 中的异常:java.lang.NullPointerException 在 org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:252) 在 org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:120) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33) 在 Persister.main(Persister.java:14) 引起:java.lang.NullPointerException 在 org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135) 在 org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1130) 在 org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296) 在 org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1115) 在 org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1233) 在 org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:154) 在 org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:869) 在 org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:183) 在 org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:240) ... 4 更多

【问题讨论】:

  • 什么时候运行?你能提供你正在运行的代码吗?还有堆栈跟踪?
  • 你能贴出 Persistence.createEntityManagerFactory 的代码吗?另外,您确定要让班级名称为 Presister 吗?确保在任何地方都是这样拼写的。
  • Persistence.createEntityManagerFactory 在 javax.persistence.Persistence 中。并且 Presister 不被称为任何仅包含“main”的地方
  • 也许如果它是一个姐妹,而不是一个presister,它会工作......;)
  • 但是说真的,Presister 的第 14 行在哪里?很高兴知道这一点。

标签: java database jpa


【解决方案1】:

此帖:http://forum.hibernate.org/viewtopic.php?t=970823)

似乎表明注释 3.2.x 存在某种问题。你用的是什么版本?如果是 3.2.x,请尝试 3.3 或 3.4。

【讨论】:

    【解决方案2】:

    您可能想看看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;
    }
    

    【讨论】:

    • 虽然它有效,但据我了解,我认为 JPA 将假定 First 中的 id 列是 Second 中 PK 的外键,反之亦然......这样你就没有使用“mappedBy”属性确定关系的所有者。谢谢
    猜你喜欢
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多