使用 Hibernate 一对一映射时外键为 null

Foreign key is null while using Hibernate One to One mapping

提问人:HAFIDA FAOUZI 提问时间:10/29/2022 最后编辑:SternKHAFIDA FAOUZI 更新时间:10/29/2022 访问量:377

问:

我正在尝试使用 hibernate,我有一个类问题和一个类答案,它们之间存在一对一的关系,代码成功运行但外键为 null,我不知道为什么。这是我的代码

package io.com.learnHibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="question")
public class Question {

    
    @Id
    private int questionId;
    private String question;
    
    
    @OneToOne(mappedBy = "question")
    private Answer answer;
    
    
    public Question() {
        super();
    }
    public Question(int questionId, String question, io.com.learnHibernate.Answer answer) {
        super();
        this.questionId = questionId;
        this.question = question;
        answer = answer;
    }
    public Answer getAnswer() {
        return answer;
    }
    public void setAnswer(Answer answer) {
        answer = answer;
    }
    public int getQuestionId() {
        return questionId;
    }
    public void setQuestionId(int questionId) {
        this.questionId = questionId;
    }
    public String getQuestion() {
        return question;
    }
    public void setQuestion(String question) {
        this.question = question;
    }

}
package io.com.learnHibernate;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="answer")
public class Answer {
    
    @Id
    private int aId;
    private String answer;
    
    @OneToOne
    @JoinColumn
    private Question question ;
    
    public Answer() {
        super();
    }
    public Answer(int aId, String answer) {
        super();
        this.aId = aId;
        this.answer = answer;
    }
    public int getaId() {
        return aId;
    }
    public void setaId(int aId) {
        this.aId = aId;
    }
    public String getAnswer() {
        return answer;
    }
    public void setAnswer(String answer) {
        this.answer = answer;
    }
}

我的文件hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>
   
      <property name = "hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
      
      <property name = "hibernate.connection.driver_class">com.mysql.jdbc.Driver </property>
      
      <!-- Assume test is the database name -->
      
      <property name = "hibernate.connection.url">jdbc:mysql://localhost:3306/aliens </property>
      
      <property name = "hibernate.connection.username">root</property>
      
      <property name = "hibernate.connection.password">root</property>
            <property name = "hibernate.hbm2ddl.auto">create</property>
        <property name = "show_sql">true</property>
      <!-- List of XML mapping files -->
                 <mapping  class= "io.com.learnHibernate.Question"/>
      <mapping  class= "io.com.learnHibernate.Answer"/>

     
   </session-factory>
</hibernate-configuration>

和我的主要功能

package io.com.learnHibernate;

import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
import org.hibernate.*;

import com.mysql.cj.xdevapi.SessionFactory;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
       //configuration
        Configuration conf=new Configuration();
        conf.configure("Hibernate.cfg.xml");
        org.hibernate.SessionFactory factory=conf.buildSessionFactory();
        
        
//creating answer 
        
        Answer a1=new Answer();
        a1.setaId(180);
        a1.setAnswer("my name is hafida");
        //creating question
        
        Question q1=new Question();
        q1.setQuestionId(3);
        q1.setQuestion("wht is your name?");
        q1.setAnswer(a1);
        
        //session 
        Session s=factory.openSession();
        Transaction tx=s.beginTransaction();
        
        //save
        s.save(q1);
          s.save(a1);

        tx.commit();
    //  s.close();
    //  factory.close();
            
    }
}

我希望插入外键的值,但它是空的

Java SQL XML 休眠 异常

评论


答:

0赞 SternK 10/29/2022 #1
  1. 您需要在实体映射中指定级联类型
@Entity
@Table(name="answer")
public class Answer {
        
    @Id
    private int aId;
    private String answer;
        
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn
    private Question question;

    // ...
}


@Entity
@Table(name="question")
public class Question {
   
    @Id
    private int questionId;
    private String question;
       
    @OneToOne(mappedBy = "question", cascade = CascadeType.ALL)
    private Answer answer;

    // ...
}
  1. 使用双向@OneToOne时,应使两端同步:
Answer a1 = new Answer();
a1.setaId(180);
a1.setAnswer("my name is hafida");
        
Question q1 = new Question();
q1.setQuestionId(3);
q1.setQuestion("wht is your name?");

// make both sides in-sync
a1.setQuestion(q1);
q1.setAnswer(a1);
  1. 然后你可以这样保存它:
s.save(q1);

// you need not use s.save(a1);
// a1 will be saved due to propagation of the q1 entity's state