美文网首页
Hibernate 的基于XML与基于注解的使用

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

作者: SYFHEHE | 来源:发表于2017-08-07 14:59 被阅读0次

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地址

相关文章

网友评论

      本文标题:Hibernate 的基于XML与基于注解的使用

      本文链接:https://www.haomeiwen.com/subject/frcalxtx.html