maven hbm2java_使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本...

本文主要是介绍maven hbm2java_使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.参考文献

2.概述

利用hibernate-Tools里的相关工具类,使得java实体类(POJO)、hbm映射文件、数据库表(Schema)之间可以相互转化。也就是说,只要有其中一样,就可以通过各种途径得到其它两样。如果手里已经有了其中一样东西,要想最快建立起应用的途径自然是通过它来生成其它两样了。后面主要讲的是通过hbm映射文件生成java实体类pojo和数据schema。

不过,我想在这里讨论的是那种从无到有,从想法到实现的那种建立全新应用的情况。那么,自然而然就会有一个问题:“从哪里开始?”。实体类pojo、hbm映射文件和数据库表?先应该建立哪一个,再通过它生成其它两个?这个问题我觉得应该从Hibernate框架的产生的初忠来考虑:为了解决“面向对象模型”与“关系模型”之间的“阻抗不匹配”。简而言之,就是说在我们的类图和E-R关系图中各元素的对应关系很难把握,而且容易让人产生概念的混淆,如“每一个数据库表对应一个实体类”等错误想法,很容易让人在设计实体时不知不觉扔掉很多面向对象模型的优秀思想。其实并不能说哪一个模型是错,只是因为他们描述问题的方向不同。那么,Hibernate框架就是把这两个模型“映射”了起来,让程序员可以在面向对象的世界里完成对数据库的查询,而不必关心底层的数据库表的结构。

【说了那么多,直接了当地讲,我不赞成“先建立数据表,再通过这个数据表生成POJO和hbm文件”这种方案。道理很简单:如果先就去考虑数据库,那么我们随后的设计势必会受到这个数据库的影响,不利于精确地描述我们的应用,Hibernate框架的好处也就体现不出来了(先就把数据库搞定了还要Hibernate来干什么),生成的POJO不用说——内容多半很别扭——因为你企图从一个非面向对象的框框里硬抽象出面向对象模型来(也许你会认为这是可以通过经验来避免的,是的,确实是,不过你不觉得这样一来工作复杂化了吗?要考虑的东西增多了)。

面向对象模型是用来精确而自然地描述问题的,这是我的看法,它提供了包含、继承等等机制,几乎能把这个世界上的所有事物之间的关系精确地描述出来——它好比一门语言——怎么方便你就怎么说。那么,先数据库再POJO的做法就好比是先规定了你只能用哪些词语之后让你说话,而先POJO再数据库就好比是让你随便说随便发挥了,自然后者要好得多。

从软件工程的角度讲,需求——用例——实体这样一趟走下来,POJO出现在数据库前面是很自然的,在OOA阶段就考虑数据库是很不可取的做法(绝对一点讲——是错误的)。

OK,剩下的POJO和hbm文件之间应该先生成哪个呢?我觉得先生成谁都无所谓,都不会对我们的工程产生不利影响了。

hbm文件作为POJO和数据库之间的桥梁,从它入手的话会有一举两得的感觉,全是干净的XML文件。当然,貌似利用xDoclet标签在我们写POJO代码的时候自动生成hbm也是很不错的感觉,这个下次再讨论吧,现在给出一个完整可用而且最简单的hbm生成POJO和Schema的示例:】

3.准备工作:

3.1.下载ant工具

我用的是apache-ant-1.7.0,当然,你要会用ant,这个可以参考前面的一篇博客: 一个ant的简单实例 。

3.2.准备相应的java包

下载hibernate-3.2.1.ga.zip,以及HibernateTools-3.2.0.beta9a.zip,本例使用mysql,驱动程序为mysql-connector-java-5.0.4。我总共用到的java包有如下图所示的jar包:

db08a32dc528918e0532a52124bb3436.gif

4.实例

在Eclipse中新建java project,项目结构如下图所示:

8a68f149661da8acf1be0425ed62b08b.gif

4.1.hibernate.cfg.xml

/p>

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

root

123456

jdbc:mysql://localhost:3306/courseChoosing

com.mysql.jdbc.Driver

org.hibernate.dialect.MySQLDialect

以上代码不用过多解释,就是hibernate的配置文件,其中有连接数据库的重要信息。那两个mapping元素是本例要创建的两个hbm文件,待会儿我们再实际地创建它,现在不用管。好了,hibernate配置文件写好了之后,我们现在该讨论一下我们将要进行的这个例子的与“业务”相关的话题了:

很简单,就拿“学生选课”这件事来做这个例子,具体描述是这样的:“一门课可以被多个学生选,一个学生也可以选择多门课。”很显然,这是一个多对多关系。画出实体类图应该是这样的(PowerDesigner12):

7cb843e32bb05e57d2aef101128c80ca.gif

也就是说,在“学生”这个类中会有一个set,保存了这个学生所选的所有的课(studentSet中保存有所有课程的id);同时,在“课程”这个类中也会有一个set,保存了所有要上这门课的学生(couseSet中保存有所有学生的id)。弄清楚了类图之后,让我们用hbm文件来分别描述这两个类:建立Course.hbm.xml和Student.hbm.xml.

4.2.Course.hbm.xml

4.3.Student.hbm.xml

这两个文件是纯粹的hbm文件描述实体类的方式,看上去很简洁,层次很清晰。需要仔细看明白的是其中的那个set元素:

name属性是这个set的名字,也就是最后生成的java代码中的这个set的名字;

table属性是这个set对应的数据库表的名字,由于这个是多对多关系,所以需要另外建立一个表来存储学生和课程之间的选择关系,不过这种细节不用管,hibernatetools会做好一切。

最重要的是那个inverse属性,它决定了多对多关系的两边到底由谁来管理双方的关系数据。inverse设为“true”的一方将不负责维护双方的关系数据,本例中考虑实际情况,决定让“学生”类来维护这个选课关系(因为从来只有学生选课或退出选课,而没有课选学生或课踢除学生的情况),于是将Course类里的set的inverse属性设为“true”,Student里的inverse为“false”。顺便提一句,如果不指明inverse属性,那么默认为false。

many-to-many元素说明了他们之间的关系,class属性指明了当前set中对象的类型,column属性指明了关系表(courseChoosing)中的外码名。

到此为止,与业务相关的东西已经描述完毕,剩下的就是编写ant脚本来实际生成ddl和java文件了。

4.4.建立build.xml文件

=========================================

PS:2011-12-26

如果要生成带注解的pojo,那么在hbm2java中还得加上其他参数,代码如下所示:

=================================================

很平常的ant脚本,需要注意的是那两个特殊的任务:hbm2java和hbm2ddl,这两个任务是hibernatetools里带的,需要定义出来,就不多说了。

好了,安装好ant之后就可以运行这个脚本了,在这里我们使用eclipse来执行执行build.xml,选中build.xml->右键->run as->Ant Build。如下图所示:

b5ac42dbaae39386e7c54384f0f24fd3.gif

打开以后出现如下界面:

cbc0d0bb9eb5a161e5b0f5870dd4a607.gif

选中在build.xml中定义的两个任务:hbm2java和hbm2ddl,然后点击Run。

在console中会显示执行结果,如下所示:

Buildfile: D:\Documents\workspace\SSHapp\build.xml

hbm2ddl:

[hbm2ddl] Executing Hibernate Tool with a Standard Configuration

[hbm2ddl] 1. task: hbm2ddl (Generates database schema)

[hbm2ddl] log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).

[hbm2ddl] log4j:WARN Please initialize the log4j system properly.

[hbm2ddl] create table course (id bigint not null auto_increment, name varchar(50), credit integer, totalClasses integer, primary key (id));

[hbm2ddl] create table courseChoosing (studentId bigint not null, courseId bigint not null, primary key (studentId, courseId));

[hbm2ddl] create table student (id bigint not null auto_increment, stuNo varchar(10), name varchar(20), gender char(1), primary key (id));

[hbm2ddl] alter table courseChoosing add index FK42CD624F924EFB30 (courseId), add constraint FK42CD624F924EFB30 foreign key (courseId) references course (id);

[hbm2ddl] alter table courseChoosing add index FK42CD624F417DBA12 (studentId), add constraint FK42CD624F417DBA12 foreign key (studentId) references student (id);

hbm2java:

[hbm2java] Executing Hibernate Tool with a Standard Configuration

[hbm2java] 1. task: hbm2java (Generates a set of .java files)

[hbm2java] log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).

[hbm2java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL

Total time: 2 seconds

大功告成了,欣赏一下结果:在java文件夹中生成的java文件代码:

4.5.Course.java

package courseChoosing;

//Generated 2011-12-14 17:04:16 by Hibernate Tools 3.2.4.GA

import java.util.HashSet;

import java.util.Set;

/*** Course generated by hbm2java*/

public class Course implements java.io.Serializable {

private long id;

private String name;

private Integer credit;

private Integer totalClasses;

private Set students = new HashSet(0);

public Course() {

}

public Course(String name, Integer credit, Integer totalClasses, Set students) {

this.name = name;

this.credit = credit;

this.totalClasses = totalClasses;

this.students = students;

}

public long getId() {

return this.id;

}

public void setId(long id) {

this.id = id;

}

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

public Integer getCredit() {

return this.credit;

}

public void setCredit(Integer credit) {

this.credit = credit;

}

public Integer getTotalClasses() {

return this.totalClasses;

}

public void setTotalClasses(Integer totalClasses) {

this.totalClasses = totalClasses;

}

public Set getStudents() {

return this.students;

}

public void setStudents(Set students) {

this.students = students;

}

}

4.6.Student.java

package courseChoosing;

//Generated 2011-12-14 17:04:16 by Hibernate Tools 3.2.4.GA

import java.util.HashSet;

import java.util.Set;

/*** Student generated by hbm2java*/

public class Student implements java.io.Serializable {

private long id;

private String stuNo;

private String name;

private Character gender;

private Set courses = new HashSet(0);

public Student() {

}

public Student(String stuNo, String name, Character gender, Set courses) {

this.stuNo = stuNo;

this.name = name;

this.gender = gender;

this.courses = courses;

}

public long getId() {

return this.id;

}

public void setId(long id) {

this.id = id;

}

public String getStuNo() {

return this.stuNo;

}

public void setStuNo(String stuNo) {

this.stuNo = stuNo;

}

public String getName() {

return this.name;

}

public void setName(String name) {

this.name = name;

}

public Character getGender() {

return this.gender;

}

public void setGender(Character gender) {

this.gender = gender;

}

public Set getCourses() {

return this.courses;

}

public void setCourses(Set courses) {

this.courses = courses;

}

}

4.7.schema文件夹中生成的courseChoosing.sql

create table course (id bigint not null auto_increment, name varchar(50), credit integer, totalClasses integer, primary key (id));

create table courseChoosing (studentId bigint not null, courseId bigint not null, primary key (studentId, courseId));

create table student (id bigint not null auto_increment, stuNo varchar(10), name varchar(20), gender char(1), primary key (id));

alter table courseChoosing add index FK42CD624F924EFB30 (courseId), add constraint FK42CD624F924EFB30 foreign key (courseId) references course (id);

alter table courseChoosing add index FK42CD624F417DBA12 (studentId), add constraint FK42CD624F417DBA12 foreign key (studentId) references student (id);

这篇关于maven hbm2java_使用Hibernate-tools中的hbm2java和hbm2ddl根据hbm文件自动生成pojo和数据库脚本...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686187

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在