簡體   English   中英

Hibernate 多對一映射集外鍵 null

[英]Hibernate many-to-one mapping sets foreign key null

學生有多台筆記本電腦。 學生 oneToMany 筆記本電腦映射

學生.java


import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Student {
    
    @Id 
    private int id;
    private StudentName studentName;
    private String email;
    
    @OneToMany(mappedBy = "student")
    private List<Laptop> laptops = new ArrayList<Laptop>();
    
    public Student() {
    }


    public Student(int id, StudentName studentName, String email) {
        this.id = id;
        this.studentName = studentName;
        this.email = email;
    }


    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    public StudentName getStudentName() {
        return studentName;
    }


    public void setStudentName(StudentName studentName) {
        this.studentName = studentName;
    }


    public String getEmail() {
        return email;
    }


    public void setEmail(String email) {
        this.email = email;
    }

    public List<Laptop> getLaptop() {
        return laptops;
    }


    public void setLaptop(List<Laptop> laptops) {
        this.laptops = laptops;
    }


    @Override
    public String toString() {
        return "Student [id=" + id + ", studentName=" + studentName + ", email=" + email + "]";
    }   
}

筆記本電腦.java

package com.practice.hibernateDemo.enity;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

@Entity
public class Laptop {

    @Id
    private int lid;
    private String lName;
    
    @ManyToOne
    @JoinColumn(name="student_id", referencedColumnName="id")
    private Student student;
    
    public Laptop() {
    }

    
    public int getLid() {
        return lid;
    }

    public void setLid(int lid) {
        this.lid = lid;
    }

    public String getlName() {
        return lName;
    }

    public void setlName(String lName) {
        this.lName = lName;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public String toString() {
        return "Laptop [id=" + lid + ", lName=" + lName + "]";
    }
}

主class

package com.practice.hibernateDemo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.practice.hibernateDemo.enity.Laptop;
import com.practice.hibernateDemo.enity.Student;
import com.practice.hibernateDemo.enity.StudentName;

public class CreateStudent {

    public static void main(String[] args) {

        Laptop laptop = new Laptop();
        laptop.setLid(100);
        laptop.setlName("HP");      
        
        Student student = new Student();
        
        student.setId(101);
        student.setEmail("test@gmail.com");
        student.setStudentName(new StudentName("test1","test2", "test3"));
        student.getLaptop().add(laptop);
        
        Configuration con = new Configuration().configure().addAnnotatedClass(Student.class).addAnnotatedClass(Laptop.class);

        SessionFactory sf = con.buildSessionFactory();

        Session session = sf.getCurrentSession();

        Transaction tx = session.beginTransaction();
        
        session.save(laptop);
        session.save(student);
        
        tx.commit();
    }

}

保存 object 后,筆記本電腦表中的外鍵設置為 null

蓋子 lName student_id 100 HP NULL

任何人都知道我在哪里做了錯誤的映射,因為我得到外鍵為 null

提前致謝

1:many 關系的“多”方始終是擁有方。 如果關系是雙向的,那么對方將攜帶一個mappedBy屬性,就像雙向 1:1 關系的非擁有方一樣。 擁有方的關系字段對於將關系傳達給持久層是有意義的,而您沒有設置它。

例如,

laptop.setStudent(student);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM