我正在尝试在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;
}