一. Hibernate 中四种对象状态
- 临时状态(transient):刚用 new 语句创建,还没有被持久化,并且不处于 Sesssion 的缓存中。处于临时状态的 Java 对象被称为临时对象。
- 持久化状态(persistent):已经被持久化,并且加入到 Session 的缓存中。处于持久化状态的 Java 对象被称为持久化对象。
- 删除状态(removed):不再处于 Session 的缓存中,并且 Session 已经计划将其从数据库中删除。处于删除状态的 Java 对象被称为删除对象。
- 游离状态(detached):已经被持久化,但不再处于 Session 的缓存中。处于游离状态的 Java 对象被称为游离对象。
二. Session的常用方法
- save()方法,将一个临时对象转变成持久化对象。
- load()方法和get()方法:
都是根据 OID 从数据库中加载一个持久化对象。
区别 1:假如数据库中不存在与 OID 对应的记录,load()方法会抛出异常,而get()方法返回 null。
区别 2:load()方法默认采用延迟加载策略(适合用于删除),get()方法采用立即检索策略(适合用于读取属性值)。
- update()方法将一个游离对象转变为持久化对象。
- saveOrUpdate()方法包含了save()和update()方法。
- merge()方法,合并对象。防止session中出现OID相同的对象需要更新的情况。
- delete()方法,删除对象。
三. 类型映射
- 基本类型映射
Hibernate 映射类型 | Java 类型 | 标准 SQL 类型 |
---|---|---|
integer | java.lang.Integer | INTEGER |
long | java.lang.Long | BIGINT |
short | java.lang.Short | SMALLINT |
float | java.lang.Float | FLOAT |
double | java.lang.Double | DOUBLE |
big_decimal | java.math.BigDecimal | NUMERIC |
character | java.lang.String | CHAR(1) |
string | java.lang.String | VARCHAR |
byte | byte 或 java.lang.Byte | TINYINT |
boolean | boolean 或 java.lang.Boolean | BIT |
yes_no | boolean 或 java.lang.Boolean | CHAR(1)(‘Y’或’N’) |
true_false | boolean 或 java.lang.Boolean | CHAR(1)(‘Y’或’N’) |
date | java.util.Date 或 java.sql.Date | DATE |
time | java.util.Date 或 java.sql.Time | TIME |
timestamp | java.util.Date 或 java.sql.Timestamp | TIMESTAMP |
calendar_date | java.util.Calendar | DATE |
binary | byte[] | VARBINARY 或 BLOB |
text | java.lang.String | CLOB |
serializable | java.io.Serializable 实例 | VARBINARY 或 BLOB |
clob | java.sql.Clob | CLOB |
blob | java.sql.Blob | BLOB |
class | java.lang.Class | VARCHAR |
locale | java.util.Locale | VARCHAR |
timezone | java.util.TimeZone | VARCHAR |
currency | java.util.Currency | VARCHAR |
- 实体类
import java.sql.Blob;
import java.util.Date;
public class Book {
private int id;
private String bookName; // 图书名称
private float price; // 图书价格
private boolean specialPrice; // 是否是特价
private Date publishDate; // 发布日期
private String author; // 作者
private String introduction; // 简介
private Blob bookPic; // 图书图片
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public boolean isSpecialPrice() {
return specialPrice;
}
public void setSpecialPrice(boolean specialPrice) {
this.specialPrice = specialPrice;
}
public Date getPublishDate() {
return publishDate;
}
public void setPublishDate(Date publishDate) {
this.publishDate = publishDate;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getIntroduction() {
return introduction;
}
public void setIntroduction(String introduction) {
this.introduction = introduction;
}
public Blob getBookPic() {
return bookPic;
}
public void setBookPic(Blob bookPic) {
this.bookPic = bookPic;
}
}
- 配置文件Book.hbm.xml
<?xml version="1.0"?>
<!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.bee.model">
<class name="Book" table="t_book">
<id name="id" column="bookId">
<generator class="native"></generator>
</id>
<property name="bookName" column="bookName" length="40"></property>
<property name="price" column="price" type="float"></property>
<property name="specialPrice" column="specialPrice" type="boolean"></property>
<property name="publishDate" column="publishDate" type="date"></property>
<property name="author" column="author" length="20"></property>
<property name="introduction" column="introduction" type="text"></property>
<property name="bookPic" column="bookPic" type="blob"></property>
</class>
</hibernate-mapping>
- 测试
SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
Session session=sessionFactory.openSession(); // 生成一个session
session.beginTransaction(); // 开启事务
Book book=new Book();
book.setBookName("java编程思想");
book.setPrice(100);
book.setSpecialPrice(true);
book.setPublishDate(new SimpleDateFormat("yyyy-MM-dd").parse("2013-1-1"));
book.setAuthor("埃克尔");
book.setIntroduction("简介...");
LobHelper lobHelper=session.getLobHelper();
InputStream in=new FileInputStream("c://java编程思想.jpg");
Blob bookPic=lobHelper.createBlob(in, in.available());
book.setBookPic(bookPic);
session.save(book);
session.getTransaction().commit(); // 提交事务
session.close(); // 关闭session
- 集合类型映射
类型 | 说明 |
---|---|
Set | 无序,元素不可重复。 |
List | 有序,元素可重复。 |
Bag | 无序,元素可重复。 |
Map | 键值对 |
class标签中
实体类属性
private Set<String> images; //元素不可重复
对应xml配置
<set name="images" table="t_image">
<!-- 外键 -->
<key column="studentId"></key>
<element column="imageName" type="string"></element>
</set>
---------------------------------------------------------------------
实体类属性
private List<String> images;
对应xml配置
<list name="images" table="t_image2">
<!-- 外键 -->
<key column="studentId"></key>
<list-index column="imageIndex"></list-index> 保证有序
<element column="imageName" type="string"></element>
</list>
---------------------------------------------------------------------
实体类属性
private List<String> images;
对应xml配置
<idbag name="images" table="t_image3">
<collection-id type="long" column="imageId">
<generator class="increment"></generator>
</collection-id>
<key column="studentId"></key>
<element column="imageName" type="string"></element>
</idbag>
---------------------------------------------------------------------
实体类属性
private Map<String,String> images;
对应xml配置
<map name="images" table="t_image4">
<key column="studentId"></key>
<map-key column="imageKey" type="string"></map-key>
<element column="imageName" type="string"></element>
</map>