Hibernate 的基于XML与基于注解的使用

1. Hibernate简介

Hibernate 是一个持久层的 ORM 框架。ORM映射:Object Relational Mapping

O:面向对象领域的 Object(JavaBean 对象)
R:关系数据库领域的 Relational(表的结构)
M:映射 Mapping(XML 的配置文件)

2. Hibernate 快速入门

2.1 导入需要用的jar包:

  • MySQL的驱动jar包
  • Hibernate开发需要的jar包
  • 日志jar包
lib.png

2.2 编写 Hibernate 核心的配置文件

我们需要在源代码文件夹的根目录下在hibernate.cfg.xml文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
   <session-factory>
       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
       <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/syf?useSSL=false</property>
       <property name="hibernate.connection.username">root</property>
       <property name="hibernate.connection.password">123456</property>
    
       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    
       <property name="show_sql">true</property>
    
       <property name="format_sql">true</property>
       
       <property name="hbm2ddl.auto">create</property>
    
       <mapping resource="com/syf/hibernate/model/xml/Student.hbm.xml"/>
       <mapping resource="com/syf/hibernate/model/xml/School.hbm.xml"/>
       <mapping class="com.syf.hibernate.model.annotation.Teacher"/>
       <mapping class="com.syf.hibernate.model.annotation.SchoolAnt"/>
       
    </session-factory>
</hibernate-configuration> 

2.1 基于注解和基于XML的对象关系映射

在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式。本例中,两种方法都会被使用。

  1. hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改为引用实体类
    即把<mapping resource="com/wsw/hibernate/model/Order.hbm.xml"/>改为<mapping class="com.wsw.hibernate.model.Order" />
  2. 获取SessionFactory方式发生了变化:即由SessionFactory sf = new Configuration().configure().buildSessionFactory() 改为:SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory()
  3. 注解方式不需要在xxx.hbm.xml把实体类与表进行映射。而采用在实体类中进行注解。

在这个例子中,基于XML的是下面两个:

  <mapping resource="com/syf/hibernate/model/xml/Student.hbm.xml"/>
  <mapping resource="com/syf/hibernate/model/xml/School.hbm.xml"/>

基于Annotation时, 在Hibernate全局配置文件中使用声明映射类的方式:

  <mapping class="com.syf.hibernate.model.annotation.Teacher"/>
  <mapping class="com.syf.hibernate.model.annotation.SchoolAnt"/>

2.3 编写映射的配置文件和POJO类

2.3.1 基于XML

基于XML的POJO是需要配置:实体类名.hbm.xml,在本例中,Student.hbm.xml为:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
 "-//Hibernate/Hibernate Mapping DTD//EN"
 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="com.syf.hibernate.model.xml">
   <class name="Student" table="xml_student">
      <id name="id" column="_id" type="int">
        <generator class="increment"/>
      </id>
      <property name="name" column="_name" type="string"/>
      <property name="age" column="_age" type="int"/>
   </class>
</hibernate-mapping>

POJO类:

package com.syf.hibernate.model.xml;

public class Student {
    private int id;
    private String name;
    private int age;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

2.3.2 基于Annotation

@Entity
@Table(name="ant_teacher")
@SequenceGenerator(name = "teacherSEQ", sequenceName = "teacherSEQ_DB")
public class Teacher {
    private int id;
    private String name;
    private String title;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "teacherSEQ")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

}

2.4 测试

2.4.1 基于XML

public class SchoolTest {

    private static SessionFactory sf = null;
    
    @BeforeClass
    public static void beforeClass(){
        Configuration cfg = new Configuration();
        sf  = cfg.configure().buildSessionFactory();
    }
    
    @AfterClass
    public static void afterClass(){
        sf.close();
    }
    
    @Test
    public void test() {
        School s = new School();
        SchoolPK pk = new SchoolPK(); 
        pk.setId(1);
        pk.setName("syf");
        s.setPk(pk);
        s.setAddress("Pujiang");
        Session session = sf.openSession();
        session.beginTransaction();
        session.save(s);
        session.getTransaction().commit();
        session.close();
    }
    
    public static void main(String[] args){
        beforeClass();
    }

}

2.4.2 基于注解

public class TeacherTest {

    private static SessionFactory sf = null;
    
    @BeforeClass
    public static void beforeClass(){
        Configuration cfg = new Configuration();
        sf  = cfg.configure().buildSessionFactory();
    }
    
    @AfterClass
    public static void afterClass(){
        sf.close();
    }
    
    @Test
    public void test() {
        Teacher t = new Teacher();
        t.setName("Syf");
        t.setTitle("master");       
        Session session = sf.openSession();
        session.beginTransaction();
        session.save(t);
        session.getTransaction().commit();
        session.close();
    }
    
    public static void main(String[] args){
        beforeClass();
    }

}

3 集成Jenkins

Jenkins是一个广泛用于持续构建的可视化web工具,就是各种项目的的“自动化”编译、打包、分发部署,将以前编译、打包、上传、部署到Tomcat中的过程交由Jenkins,Jenkins通过给定的代码地址,将代码拉取到jenkins宿主机上,进行编译、打包和发布到web容器中。Jenkins可以支持多种语言(比如:java、c#、php等等),也兼容ant、maven、gradle等多种第三方构建工具,同时跟git、svn无缝集成,也支持直接与github直接集成。Jenkins+GitHub 环境构建可以参考下面的文章:Jenkins+GitHub 环境构建
这里我们主要用Jenkins从GitHub上拖代码,一旦有更新,就构建一次,跑Ant脚本,实现清理,编译,测试等功能,build.xml具体实现如下:

<?xml version="1.0"?>
<project name="HibernateHelloworld" default="test" basedir=".">
    <property name="build.dir" value="build"/>
    <property name="src.dir" value="src"/>
    <property name="test.dir" value="test"/>
    <property name="src.build.dir" value="build/src"/>
    <property name="test.build.dir" value="build/test"/>

    <path id="compile.classpath">
        <fileset dir="${basedir}/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>

    <path id="test.classpath">
        <path refid="compile.classpath"/>
        <pathelement location="lib/junit.jar"/>
        <pathelement location="${src.build.dir}"/>
    </path>

    <target name="clean" description="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="init" depends="clean" description="create folders">
        <mkdir dir="${src.dir}"/>
        <mkdir dir="${test.dir}"/>
        <mkdir dir="${src.build.dir}"/>
        <mkdir dir="${test.build.dir}"/>
        <copy file="${src.dir}/hibernate.cfg.xml" tofile="${src.build.dir}/hibernate.cfg.xml"/>
        <copy todir="${src.build.dir}">
            <fileset dir="${src.dir}">
                <exclude name="**/*.java"/>
            </fileset>
        </copy>
    </target>

    <target name="compile" depends="init" description="compile the source">
        <javac srcdir="${src.dir}" destdir="${src.build.dir}" classpathref="compile.classpath"/>
    </target>

    <target name="test-compile" depends="compile">
        <javac srcdir="${test.dir}" destdir="${test.build.dir}" classpathref="test.classpath"/>
    </target>

    <target name="test" depends="test-compile">
        <junit printsummary="on" haltonfailure="yes" fork="true">
            <classpath>
                <path refid="test.classpath"/>
                <pathelement location="${test.build.dir}"/>
            </classpath>
            <formatter type="brief" usefile="false"/>
            <batchtest>
                <fileset dir="${test.dir}" includes="**/*Test.java"/>
            </batchtest>
        </junit>
    </target>

</project>

Jenkins的配置信息如下:
主要配置了Github的地址,构建触发条件以及Build.xml文件的地址。

jenkins1.png
jenkins2.png

4 补充

本例子中,SchoolPK.java,School.java和SchoolAnt.java,SchoolAntPK.java分别是Hibernate关于复合(联合)主键映射的实现,具体实现方法见Github代码。

目前有两个文件夹:

项目名称 描述
Hibernate Hibernate简单实现
HibernateHelloWorld Demo
HibernateHelloWorld Demo

GitHub地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容