zoukankan      html  css  js  c++  java
  • java使用Myeclipse创建Hibernate项目碰到的诸多问题总结

    这两天一直在搞Myeclipse创建Hibernate的1对多映射。

    由于缺乏经验,可算是把我坑惨了。控制台是不停地报错啊~~~~我差点就崩溃了。

    1.看的是慕课网的Hibernate一对多映射教程,由于老师Myeclipse的Hibernate高版本是3.3,于是老师就自己

    下载了4.3版本,拖拽到项目中,然后所有的文件(hibernate.cfg.xml;**.hbm.xml;sessionFactory工具类以

    及持久化类和SQL生成表的代码)都是手写~~~

    2.然后我稍微看了一下马士兵老师的Hibernate讲解,看了一章:到底是先创建类还是先创建表。得出的结论是:

    理论上是先创建类然后再创建表,但是实际项目开发几乎都会先建表然后再建类。

    而且Myeclipse是可以根据表反向生成持久化类的(以及各种配置文件和工具类),大大地简化了工作量。

    3.于是,先为项目添加Hibernate规则,自动生成了hibernate.cfg.xml工具类,然后建表grade和student,

    grade的主键是student的外键,然后Myeclipse连接上数据库,点击表右键,选择Hibernate***,选择生成

    持久类的位置,然后选择主键生成机制:这里注意一下,虽然说native会根据底层数据库自动选择生成机

    制,但是,最好还是显式地选择机制(assigned:手动添加;increment:自动递增;等等)。

    然后选择表的关联:

    这里注意上面两个框要是打钩的话,会同时帮你生成与此表有关联的表的持久化类和配置文件,我们打钩!省得表

    多的话要多操作几次。

    4.好,这样就已经生成了数据库表对应的持久化类和配置文件

    -----------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------

    但是问题就会出现在这里,我们做的是一对多的映射,Grade.hbm.xml有  <one-to-many class="file.Student" />属

    性是正常的,因为班级要对应多名学生,可是Myeclipse为我们生成Student.hbm.xml文件时,自动添加了

    <many-to-one name="grade" class="file.Grade" fetch="select">
    <column name="gid" />
    </many-to-one>

    我们的这个demo是不需要many-to-one的,所以这个文件的这个属性字段应该删除。

    另外,再来看Grade.hbm.xml中这段:

    1         <set name="students" inverse="true">
    2             <key>
    3                 <column name="gid" />
    4             </key>
    5             <one-to-many class="file.Student" />
    6         </set>

    这个set标签,其实是少了一个属性字段,table="student"来表示对student表的映射,应当加上

    <set name="students" inverse="true" table="student">

    5.我们再来看Student.java这个持久化类:

    1     private Integer sid;
    2     private Grade grade;
    3     private String sname;
    4     private String sex;

    我们为student表添加了一个外键(对应grade表的主键),但是Myeclipse生成持久化类的时候却为这个类添加了一

    个Grade类的属性grade,并为其配置了getter、setter方法,这是不需要的!立马删除!构造方法里面的Grade参数

    也要删除!

    6.如此一来,我们可以安心地写测试类了

     1 public class TTest {
     2     private Session session;
     3     private Transaction transaction;
     4 
     5     @Before
     6     public void init() {
     7         session = HibernateSessionFactory.getSession();
     8         transaction = session.beginTransaction();
     9     }
    10 
    11     @After
    12     public void distory() {
    13         transaction.commit();
    14         session.close();
    15     }
    16 
    17     @Test
    18     public void todo() {
    19         Grade g = new Grade(104, "java", "java学习1班");
    20         Student s = new Student(12, "桔子桑", "男");
    21         g.getStudents().add(s);
    22         session.save(g);
    23         session.save(s);
    24     }
    25 }

    这是用JUnit单元测试工具写的测试类,前面两个方法就是一些初始化,销毁操作,真正的操作细节在todo()方法

    里,我们来看一下这个方法:

    首先建一个班级,班级号(gid)也就是student表的外键为104;

    再建一个学生学号为12,注意这里是没有外键字段gid的,学生表的持久类Student里面也是没有的;

    然后取得班级的Students属性(持久化类是就已经生成,类型是个Set表,用于存储班级的学生),并为其添加这

    个学生s,然后save,save。

    接下来看生成的数据库表:

    ------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------

    就这样,在为班级表添加学生的时候,也就自动匹配了学生表的gid字段值。

    附上增删改查:

     1     @Test
     2     public void todoadd() {        
     3         Grade g = (Grade) session.get(Grade.class, 104);
     4         Student s = new Student(13, "桔子桑", "男");
     5         g.getStudents().add(s);
     6         session.save(s);
     7     }
     8     @Test
     9     public void todofind(){
    10         Grade g = (Grade) session.get(Grade.class, 104);
    11         Set<Student> list = g.getStudents();
    12         for (Student stu : list) {
    13             System.out.println("姓名:"+stu.getSname());
    14         }
    15     }
    16     @Test
    17     public void tododelete(){
    18         Student s = (Student)session.get(Student.class, 12);
    19         session.delete(s);
    20     }
    21     @Test
    22     public void todoupdate(){
    23         Student s = (Student)session.get(Student.class, 13);
    24         s.setSname("eco");
    25         session.update(s);
    26     }

    完结撒花~~~~~~~~~

  • 相关阅读:
    Java实现三人年龄
    从session中获取当前用户的工具类
    全局Session-GlobalSession
    Request获取Session的两种方式
    跨域访问sessionid不一致问题
    获得HttpServletRequest 和HttpSession对象
    eclipse pom.xml 报错org.apache.maven.plugin.war.WarMojo的解决办法
    idea与eclipse项目相互导入的过程
    静态工具类中使用注解注入service实例
    解决静态utils里面注入mapper对象
  • 原文地址:https://www.cnblogs.com/eco-just/p/7827412.html
Copyright © 2011-2022 走看看