搭建Hibernate的过程
1.添加jar包
2.创建持久化类
3.Hibernate的配置文件(数据库相关信息,和Hibernate基本配置信息)
4.创建对象关系映射文件(基于配置文件的映射,还有基于注解的方式实现)
5.通过Hibernate API编写访问数据库的代码
对Hibernate映射文件详解,配置信息用来干嘛的在配置文件中都有详细的说明。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.iflytek.test.domain">
<!-- 指定pojo和table之间的映射 -->
<class name="Student" table="TB_STUDENT">
<!-- pojo 属性和 数据库表字段进行映射 -->
<!-- pojo中的主键属性 id hibernate中必须配置 -->
<id name="id" column="ID" type="long">
<!-- oracle数据库中id属性设置为自增长类型 -->
<generator class="sequence">
<param name="sequence">SEQ_STUDENT</param>
</generator>
</id>
<!-- 可选属性
type:指定java类型
not-null:属性不能为空
unique:记录必须唯一
length:对属性的长度进行检查
-->
<property name="name" column="NAME" type="string" not-null="true" length="20"></property>
</class>
</hibernate-mapping>
对于实体之间一对一,一对多之间的这种映射关系的配置,留在通过属性配置ORM来说明,再此不使用配置文件的形式来实现。
Hibernate API提供发几个基本的CRUD方法
public class FirstTest {
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
Student stu = (Student) session.get(Student.class, 2l);
System.out.println(stu.toString());
Student s = new Student();
s.setName("Lily");
//session API几个基本的CRUD方法
session.delete(s);
session.update(s);
session.saveOrUpdate(s);
session.save(s);
transaction.commit();
session.close();
}
}
现在开始基于注解的形式创建Hibernate项目
项目结构基本不变,配置文件中配置ORM映射做一个修改,删除Student.hbm.xml映射文件采用注解的形式。
<!-- <mapping resource="com/iflytek/test/domain/Student.hbm.xml"/> -->
<!-- 基于注解的形式配置ORM映射 -->
<mapping class="com.iflytek.test.domain.Student"/>
对于Entity类加上注解
package com.iflytek.test.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
/**
* @desc: Hibernate02
* @author: star2013
* @createTime: 2017年5月14日 上午12:12:05
* @history:
* @version: v1.0
*/
//注解称之为标注,标记为打一个标签
//@Entity,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类)
//@Table,注册在类头上,注解声明了该实体bean映射指定的表(table)。
//@SequenceGenerator主键生成策略,name别名,sequenceName数据库中的sequence名.一般两个值取一样
@Entity
@Table(name="TB_STUDENT")
@SequenceGenerator(name="SEQ_ID",sequenceName="SEQ_STUDENT")
public class Student {
//@Id用来标识主属性列
//标记主键生成策略
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="SEQ_ID")
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
测试以注解的形式配置ORM是否生效,运行程序观看控制台的打印信息:
从控制台中的信息可以看出,使用注解的形式来配置是生效了的,通过这样的方式可以有效的减少了每一个类写一个ORM映射文件的工作量,通过注解就可以完成基本的信息配置。
常用注解的配置信息解释
注解:实际上是一个注释,用来标记对象(字段,type,方法),为特殊用途,给某些程序读取使用
target:标记目标,type field method
@Retention:状态持续的范围(一般是配置运行状态生效)
@Entity,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) 。
@Table,注册在类头上,注解声明了该实体bean映射指定的表(table)。
@SequenceGenerator( name=”SEQ_ID”,sequenceName=”my_sequence”)
@Id用来标识主属性列,
标记主键生成策略
@GeneratedValue:@GeneratedValue(strategy=GenerationType.IDENTITY)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator=”SEQ_ID”)
@Column:标识列-属性,
@Transient用来注册不是数据库关联的属性
以上的@Id、@GeneratedValue、 @Column:可以写在属性也可写在属性对应的getter上。
@Transient注册在多余的属性上,在getter上时必须与以上的@Column等对应
@Column里面的属性
name=”列名” (用于处理当数据库的表与pojo属性不一样的情况)
unique=false该列是否设置唯一 默认false
nullable 该列是否可为空 默认false
insertable :该列在生成的insert语句中的出现 默认 true
updatable :该列在生成的update语句中的出现 默认 true
length :长度 默认255