提问人:HAFIDA FAOUZI 提问时间:10/29/2022 最后编辑:SternKHAFIDA FAOUZI 更新时间:10/29/2022 访问量:377
使用 Hibernate 一对一映射时外键为 null
Foreign key is null while using Hibernate One to One mapping
问:
我正在尝试使用 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();
}
}
我希望插入外键的值,但它是空的
答:
0赞
SternK
10/29/2022
#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;
// ...
}
- 使用双向@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);
- 然后你可以这样保存它:
s.save(q1);
// you need not use s.save(a1);
// a1 will be saved due to propagation of the q1 entity's state
评论