Java 休眠,从集合中删除

Java 休眠,从集合中删除,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

我有一个数据库,其中包含两个表,它们通过一对多关系进行连接。我通过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-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.dele‌​te(question) 
saveOrUpdate()仅用于在不存在时创建新记录,或在确实存在时进行更新。请查找下面的伪代码

Question question = new Question(); 
question.setText("question1");

Answer deleteAns=new Answer();
deleteAns.setText("answer2");

question.setAnswer(deleteAns);
session.dele‌​te(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);删除(问题)