这两天一直在搞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中这段:

         <set name="students" inverse="true">
<key>
<column name="gid" />
</key>
<one-to-many class="file.Student" />
</set>

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

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

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

     private Integer sid;
private Grade grade;
private String sname;
private String sex;

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

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

也要删除!

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

 public class TTest {
private Session session;
private Transaction transaction; @Before
public void init() {
session = HibernateSessionFactory.getSession();
transaction = session.beginTransaction();
} @After
public void distory() {
transaction.commit();
session.close();
} @Test
public void todo() {
Grade g = new Grade(104, "java", "java学习1班");
Student s = new Student(12, "桔子桑", "男");
g.getStudents().add(s);
session.save(g);
session.save(s);
}
}

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

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

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

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

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

个学生s,然后save,save。

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

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

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

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

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

附上增删改查:

     @Test
public void todoadd() {
Grade g = (Grade) session.get(Grade.class, 104);
Student s = new Student(13, "桔子桑", "男");
g.getStudents().add(s);
session.save(s);
}
@Test
public void todofind(){
Grade g = (Grade) session.get(Grade.class, 104);
Set<Student> list = g.getStudents();
for (Student stu : list) {
System.out.println("姓名:"+stu.getSname());
}
}
@Test
public void tododelete(){
Student s = (Student)session.get(Student.class, 12);
session.delete(s);
}
@Test
public void todoupdate(){
Student s = (Student)session.get(Student.class, 13);
s.setSname("eco");
session.update(s);
}

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

java使用Myeclipse创建Hibernate项目碰到的诸多问题总结的更多相关文章

  1. MyEclipse创建SSH项目(Java web由maven管理)

    JavaEE后台开发,MyEclipse创建SSH项目,MyEclipse创建Java web 由maven管理的SSH项目. Demo工程源码github地址 1.创建SSH项目 1.创建web工程 ...

  2. 通过myEclipse创建hibernate的实体类

    今天有个新项目中需要使用到hibernate,刚好数据库表已经创建完毕,就顺便来总结一下通过myEclipse创建hibernate的实体类. 1..在myEclipse中选择MyEclipse Da ...

  3. Maven -- 使用Myeclipse创建Maven项目

    使用Myeclipse创建Maven项目有如下几种方式: 1.创建Maven Java项目 1.1 选择新建Maven项目 1.2.选择创建简单项目 1.3.填写项目信息 1.4.创建成功后项目目录结 ...

  4. 如何在浏览器中输入(myeclipse创建的项目的)地址访问JSP页面

    如何在浏览器中输入(myeclipse创建的项目的)地址访问JSP页面 可以在Tomcat项目里面查看你的JSP页面在哪里,具体的路径为: tomcat--work--localhost--项目名称, ...

  5. Maven3路程(五)用Maven创建Hibernate项目

    本文将用Maven3.Hibernate3.6.Oracle10g整合,作为例子. 环境清单: 1.Maven3.0.5 2.Hibernate3.6.5 Final 3.JDK1.7.0.11 4. ...

  6. Intellij Idea 用Maven 创建Hibernate 项目

    第一步:创建maven项目 2. 3. 4.第三步保存之后进行下一步 到此点击finish maven项目创建成功,点击完成后会进行一系列jar包的下载 maven 仓库的默认存储位置 第二步:连接数 ...

  7. 【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】

    之前一直是使用Eclipse创建Web项目,用IDEA和MyEclipse的创建SpringMVC项目的时候时不时会遇到一些问题,这里把这个过程记录一下,希望能帮助到那些有需要的朋友.我是用的是MyE ...

  8. MyEclipse创建Web项目入门指南

    MyEclipse 在线订购年终抄底促销!火爆开抢>> MyEclipse最新版下载 本教程将指导您创建和部署简单的Hello World Web项目.在本教程中,您将学习如何: 创建一个 ...

  9. Maven学习一:使用Myeclipse创建Maven项目

    使用Myeclipse2014创建Maven项目有如下几种方式: 1.创建Maven Java项目 1.1 选择新建Maven项目 1.2.选择创建简单项目 1.3.填写项目信息 1.4.创建成功后项 ...

随机推荐

  1. TOMCAT数据源连接配置

    /* *本文档简单介绍系统使用TOMCAT6.0数据源方式连接数据库的配置方法: *1,系统环境:  gdczsam4.0 + Tomcat6.0 + JDK1.5 + SQL Server2008 ...

  2. JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

    JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是clas ...

  3. Java实现二叉树的创建和遍历操作(有更新)

    博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...

  4. 青年菜君与小农女送菜商业模式PK

    青年菜君与小农女送菜商业模式PK   对比项 青年菜君 小农女送菜 优势 劣势 开业 2014年3月3日 2013年9月 渠道 地铁捕获用户 写字楼配送 送货 来店面自取 送货到写字楼 菜君 1.减少 ...

  5. Linux C 下的大文件操作

    这里说的大文件指大小超过4G的文件. 在32位环境下,linux默认打开.读.写超过4G的文件会返回错误.定义如下宏可以突破这个限制,对read/write和fread/fwrite同时有效. 注意它 ...

  6. React Native之AppRegistry模块

    我们在写react native的js的时候,在最后总会加上一段代码: AppRegistry.registerComponent('ReactDemo', () => ReactDemo); ...

  7. (六十一)Xcode的git版本控制

    打开终端 1.为项目添加git: 首先到达项目的根目录内部,输入git init,初始化一个空的代码仓库(隐藏文件.get). 接下来使用git add . --all .表达把当前目录及子目录中的文 ...

  8. 漫谈程序员(十一)老鸟程序员知道而新手不知道的小技巧之Web 前端篇

    老鸟程序员知道而新手不知道的小技巧 Web 前端篇 常充电!程序员只有一种死法:土死的. 函数不要超过50行. 不要一次性写太多来不及测的代码,而是要写一段调试一段. UI和编码要同步做. 多写注释方 ...

  9. LeetCode之“链表”:在O(1)时间删除链表节点

    下边讨论暂不包括尾节点. 一般来说,我们要删除链表中的一个节点是需要知道其上一节点的.但我们真的需要吗? 其实我们可以将待删节点的下一节点的值和指向的下一节点赋予待删节点,然后删除待删节点的下一节点. ...

  10. Linux引导流程(第二版)

    Linux引导流程 柱面,0磁头,1扇区 如图:] 进入这一步骤的目的是[通常,PID是随机分配的,但是init特殊,可以通过命令:ps -el | more 查看],Linux系统中init名义上可 ...