2016-11-30 55 views
1

我正在开发一个应用程序并首次使用Hibernate。我试图实现1-2-1映射,但它导致NullPointerException。我使用Oracle作为后端。oracle SQL Hibernate一对一映射返回NullPointerException

学生类

@Entity 
@Table(name="student_info") 
public class Student_Info { 

    @Id 
    @SequenceGenerator(name="sid", sequenceName="ids", initialValue=1, allocationSize=1) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="sid") 
    private int rollNo; 

    @Column 
    private String sname; 

    public int getRollNo() { 
     return rollNo; 
    } 
    public void setRollNo(int rollNo) { 
     this.rollNo = rollNo; 
    } 
    public String getSname() { 
     return sname; 
    } 
    public void setSname(String sname) { 
     this.sname = sname; 
    } 
} 

Student_detail类

@Entity 
@Table(name="student_detail") 
public class Student_detail { 
    @Id 
    @GeneratedValue(generator="newGenerator")//name of the primary key generator 
    @GenericGenerator(name="newGenerator", strategy="foreign", parameters={@Parameter(value="Student_Info", name="property")}) 
    private int rollno; 
    private String phone; 

    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="rollno") 
    private Student_Info student_Info; 

    public int getRollno() { 
     return rollno; 
    } 

    public void setRollno(int rollno) { 
     this.rollno = rollno; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public void setPhone(String phone) { 
     this.phone = phone; 
    } 

    public Student_Info getStudent_Info() { 
     return student_Info; 
    } 

    public void setStudent_Info(Student_Info student_Info) { 
     this.student_Info = student_Info; 
    } 
} 

主类

Student_Info student_Info = new Student_Info(); 
student_Info.setSname("Vivek Singh"); 

Student_detail detail = new Student_detail(); 
detail.setPhone("2345678");  
detail.setStudent_Info(student_Info); 

SessionFactory factory = new Configuration().configure("hibernate/hibernate.cfg.xml").buildSessionFactory(); 
Session session = factory.openSession(); 
session.beginTransaction();  

session.save(detail); 
session.getTransaction().commit(); 

session.close(); 
factory.close(); 

错误

Exception in thread "main" java.lang.NullPointerException 
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.getPropertyValue(AbstractEntityTuplizer.java:547) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:4636) 
    at org.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:81) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:105) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:668) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:660) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:655) 
    at com.hiber.Main.main(Main.java:23) 

DB在外键中已经存在。还有一件事我正在使用序列来生成id,所以我认为它导致了问题,我不确定。

回答

2
@GenericGenerator(name="newGenerator", strategy="foreign", parameters={@Parameter(value="Student_Info", name="property")}) 

在这里,您指定了像value = "Student_Info"这在这个映射无效。你必须指定像value = "student_Info".(名称不是类的名称)。这固定了它。

+0

感谢它现在的工作。这个小小的错误毁了我很多时间。 –