Hibernate中多对一问题详解

来源:互联网 发布:南海海沟大地震 知乎 编辑:程序博客网 时间:2024/05/18 03:20

以Student、Sc、Course为例

一、代码(以下所有文件都在同一个包中,所以不用再导入)

1.在Sc.hbm.xml中添加

<many-to-one name="stu" column="sno" class="fac.Student" cascade="all" unique="true"></many-to-one><many-to-one name="course" column="cno" class="fac.Course" cascade="all" unique="true"></many-to-one>


2.在Sc.java文件中添加

private Student stu;private Course course;


3.添加测试类Test,方便直接生成三个表或者在文件中想数据库中表添加数据。
package fac;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import org.junit.After;import org.junit.Before;import org.junit.Test;public class Test1 {private SessionFactory sessionFactory;private Session session;private Transaction transaction;@Beforepublic void init(){Configuration configuration=new Configuration().configure();ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();sessionFactory=configuration.buildSessionFactory(serviceRegistry);session=sessionFactory.openSession();transaction=session.beginTransaction();}@Afterpublic void destroy(){transaction.commit();session.close();sessionFactory.close();}@Testpublic void test() {/*Course course=new Course("1", "数据库", "5", (short)4);Course course1=new Course("2", "数学", "", (short)2);Course course2=new Course("3", "信息系统", "5", (short)4);Course course3=new Course("4", "操作系统", "5", (short)3);Course course4=new Course("5", "数据结构", "5", (short)4);Course course5=new Course("6", "数据处理", "", (short)2);Course course6=new Course("7", "C语言", "5", (short)4);session.save(course);session.save(course1);session.save(course2);session.save(course3);session.save(course4);session.save(course5);session.save(course6);*/}}


4.添加test1.java,测试三个表的关联关系。

package fac;import org.hibernate.Session;import org.hibernate.Transaction;public class test {public static void main(String[] args){Session session = HibernateSessionFactory.getSession();Transaction trans = session.beginTransaction();//student和sc关联后获取各项值Sc sc=(Sc) session.get(Sc.class, 2);System.out.println(sc.getCno());System.out.println(sc.getStu().getSno());System.out.println(sc.getStu().getSname());System.out.println(sc.getGrade());/*//修改Sc sc=(Sc) session.get(Sc.class, 1);sc.setCno("5");session.saveOrUpdate(sc);*//*//添加新记录Sc sc=new Sc();sc.setCno("7");sc.setGrade((short)90);sc.setStu(new Student("95007","lili"));session.save(sc);trans.commit();*//*Sc sc=(Sc) session.get(Sc.class, 1);String cno=sc.getCourse().getCno();Course course=(Course) session.get(Course.class, cno);sc.getCourse().setCname("数学");*///sc.getCourse().setCno("9");//sc.setCourse(course);/*session.clear();session.saveOrUpdate(course);session.clear();session.saveOrUpdate(sc);System.out.printf("%s %s %s \n",sc.getStu().getSno(),sc.getCourse().getCno(),sc.getCourse().getCname());*///添加新纪录//Sc sc=new Sc();//sc.setGrade((short)79);//sc.setCourse(new Course("9","java"));//sc.setStu(new Student("95005","lili"));//session.save(sc);////遍历/*String sql="from Sc";List<Sc> sc2=session.createQuery(sql).list();for(Sc sc1:sc2){System.out.printf("%s %s %s %d \n",sc1.getStu().getSno(),sc1.getStu().getSname(),sc1.getCourse().getCno(),sc1.getGrade());}*/trans.commit();HibernateSessionFactory.closeSession();}}
二、碰到的问题

1.Sc和Student关联后,Sc创建的对象不能直接获取sno,需要写成sc.getStu().getSno()形式,获取cno时同理。

2.当编辑表内容时,注意用session.saveOrUpdate(sc);

3.修改course表中cno时,报identifier of an instance of XXX was altered from X to X错误,在save前添加session.clear();即可。

例:


(1)如果新修改的cno在原表中不存在,则新添加一行记录;

例:执行sc.getCourse().setCno("9");  会出现上图第九行记录

(2)如果存在,则直接覆盖存在的cname。

如果执行sc.getCourse().setCno("3");  那么“信息系统”会被修改成“数学”。





原创粉丝点击