Java 休眠,从集合中删除
我有一个数据库,其中包含两个表,它们通过一对多关系进行连接。我通过Hibernate进入该数据库 这是hbm.xml文件: question.hbm.xmlJava 休眠,从集合中删除,java,hibernate,collections,Java,Hibernate,Collections,我有一个数据库,其中包含两个表,它们通过一对多关系进行连接。我通过Hibernate进入该数据库 这是hbm.xml文件: question.hbm.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-map
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="app">
<class name="Question" table="Question">
<id name="id" column="id" type="java.lang.Long">
<generator class="native"/>
</id>
<property name="text" column="text" type="java.lang.String" not-null="true"/>
<set name="answers" cascade="all">
<key column="question_id"/>
<one-to-many class="Answer"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="app">
<class name="Answer" table="Answer">
<id name="id" column="id" type="java.lang.Long">
<generator class="native"/>
</id>
<property name="text" column="text" type="java.lang.String" not-null="true"/>
<many-to-one name="question" column="question_id" class="Question" not-null="true"/>
</class>
</hibernate-mapping>
所以问题可以有答案,而问题实例有一组答案实例
这是主要方法:
package application;
import app.Answer;
import app.Question;
import java.util.HashSet;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class Application {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
Question question = new Question();
question.setText("question1");
Answer answer1 = new Answer();
answer1.setText("answer1");
answer1.setQuestion(question);
Answer answer2 = new Answer();
answer2.setText("answer2");
answer2.setQuestion(question);
HashSet<Answer> answers = new HashSet<>();
answers.add(answer1);
answers.add(answer2);
question.setAnswers(answers);
session.beginTransaction();
try {
session.saveOrUpdate(question);
session.getTransaction().commit();
} catch (Exception ex) {
ex.printStackTrace();
session.getTransaction().rollback();
}
answers.remove(answer2);
session.beginTransaction();
try {
session.saveOrUpdate(question);
session.getTransaction().commit();
} catch (Exception ex) {
ex.printStackTrace();
session.getTransaction().rollback();
}
}
}
包应用;
导入app.Answer;
导入应用程序问题;
导入java.util.HashSet;
导入org.hibernate.Session;
导入org.hibernate.SessionFactory;
导入org.hibernate.cfg.Configuration;
公共类应用程序{
公共静态void main(字符串[]args){
SessionFactory SessionFactory=新配置().configure().buildSessionFactory();
Session Session=sessionFactory.openSession();
问题=新问题();
问题1;
答案1=新答案();
回答1.setText(“回答1”);
回答1.设置问题(问题);
答案2=新答案();
回答2.setText(“回答2”);
回答2.设置问题(问题);
HashSet answers=新HashSet();
答案。添加(答案1);
答案。添加(答案2);
问题.答案(答案);;
session.beginTransaction();
试试{
会议.保存或更新(问题);
session.getTransaction().commit();
}捕获(例外情况除外){
例如printStackTrace();
session.getTransaction().rollback();
}
答案。删除(答案2);
session.beginTransaction();
试试{
会议.保存或更新(问题);
session.getTransaction().commit();
}捕获(例外情况除外){
例如printStackTrace();
session.getTransaction().rollback();
}
}
}
所以我创建了问题实例,将两个答案实例添加到问题实例中的集合中,并将问题实例保存到数据库中。所有工作正常-问题和答案被写入数据库。
然后,我从问题实例集合中移除一个答案实例,并再次尝试将问题实例保存到数据库中。我发现了一个例外。这是我的母语,但它是SQLServerException,它说的是这样的:“不能在“Test.dbo.Answer”表中的“question_id”列中插入NULL”,在该列中禁止NULL。更新中出错”
怎么了?如何从问题中删除一个答案?saveOrUpdate()仅用于在不存在时创建新记录,或在确实存在时进行更新。请查找下面的伪代码
Question question = new Question();
question.setText("question1");
Answer deleteAns=new Answer();
deleteAns.setText("answer2");
question.setAnswer(deleteAns);
session.delete(question)
saveOrUpdate()仅用于在不存在时创建新记录,或在确实存在时进行更新。请查找下面的伪代码
Question question = new Question();
question.setText("question1");
Answer deleteAns=new Answer();
deleteAns.setText("answer2");
question.setAnswer(deleteAns);
session.delete(question)
在双向关系中,一侧必须是相反的一侧。在
一对多
关联中,通常是one-
端:
<set name="answers" cascade="all" inverse="true">
<key column="question_id"/>
<one-to-many class="Answer"/>
</set>
这样,只有many-
一方才能处理关系
在您的情况下,双方都这样做,并且由于外键位于
答案
类/表中,Hibernate在刷新问题
类中的关联更改时将其更新为null
。在双向关系中,一侧必须是相反的一侧。在一对多
关联中,通常是one-
端:
<set name="answers" cascade="all" inverse="true">
<key column="question_id"/>
<one-to-many class="Answer"/>
</set>
这样,只有many-
一方才能处理关系
在您的情况下,双方都这样做,并且由于外键在
答案类/表中,Hibernate在刷新问题类中的关联更改时将其更新为null
。我认为您应该通过会话调用给定对象的delete:session.delete(entity);saveOrUpdate()仅用于在不存在时创建新记录,或在确实存在时进行更新。请查找下面的伪代码。问题=新问题();问题1;答案deleteAns=新答案();deleteAns.setText(“回答2”);问题.setAnswer(deleteAns);session.delete(问题)我认为您应该通过会话调用给定对象的delete:session.delete(entity);saveOrUpdate()仅用于在不存在时创建新记录,或在确实存在时进行更新。请查找下面的伪代码。问题=新问题();问题1;答案deleteAns=新答案();deleteAns.setText(“回答2”);问题.setAnswer(deleteAns);删除(问题)