通过注释休眠一对一映射



我正在尝试在Hibernate中尝试一个应用程序,以通过注释实现hibernate一对一关联。我正在使用两个 POJO 类并将它们相互关联,但在执行时我遇到了这个问题。

代码:我有2个班级学生,地址。我需要两者之间的双向 1-1 映射。

    @Entity
    @Table(name = "STUDENT")
    public class Student {
        @Id
        @GeneratedValue
        @Column(name = "STUDENT_ID")
        private long id;
        @Column(name = "FIRST_NAME")
        private String firstName;
        @OneToOne(mappedBy="student", cascade = CascadeType.ALL)
        private Address address;
        ----getters and setters---
    }
    @Entity
    @Table(name = "ADDRESS")
    public class Address {
        @Id
        @Column(name="ADDRESS_ID")
        @GeneratedValue(generator="gen")
        @GenericGenerator(name="gen", strategy="foreign",parameters=@Parameter(name="property", value="student"))
        private long id;
        @Column(name = "STREET")
        private String street;
        @Column(name = "CITY")
        private String city;
        @Column(name = "COUNTRY")
        private String country;
        @OneToOne
        @PrimaryKeyJoinColumn
        private Student student;
        ----getters and setters---
    }

下面是我的示例主类

    public class MainClass1 {
        public static void main(String[] args) {
            Session  session = HibernateUtil.getSessionFactory().openSession();
            Student student = new Student("Sam","Disilva","Maths");
            Address address = new Address("10 Silver street","NYC","USA");
            student.setAddress(address);
            session.save(address);
            session.save(student);
            session.getTransaction().commit();
            HibernateUtil.shutdown();
        }
    }

异常跟踪:

Initial SessionFactory creation failed.java.lang.NullPointerException
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.learn.main.HibernateUtil.buildSessionFactory(HibernateUtil.java:15)
    at com.learn.main.HibernateUtil.<clinit>(HibernateUtil.java:8)
    at com.learn.main.MainClass1.main(MainClass1.java:17)
Caused by: java.lang.NullPointerException
    at org.hibernate.cfg.OneToOneSecondPass.doSecondPass(OneToOneSecondPass.java:135)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1127)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:296)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1283)
    at com.learn.main.HibernateUtil.buildSessionFactory(HibernateUtil.java:12)
    ... 2 more

首先,尝试更改Address部分的@OneToOne映射。

@Entity
@Table(name = "ADDRESS")
public class Address {
    @OneToOne
    @JoinColumn(name = "fk_student")
    private Student student;
}

最新更新