【Hibernate3】(3)数据库生成策略

来源:互联网 发布:时代互联域名 编辑:程序博客网 时间:2024/06/12 18:47

一. 常用主键生成策略

在User.hbm.xml配置文件中,对id的<generator>有如下几种常用配置:

1. increment

是HIbernate自己生成的一个策略,先从数据库中查询最大的一个id,然后加1保存新的数据。

2. native、identity

自动生成主键自增长的策略。

3. assigned

当没有指定主键的时候,会给主键设置0的默认值。

4. hilo

使用一个高/低位算法的策略。

5. native

默认配置,由hibernate自己选择。

6. uuid

根据指定字符串生成主键

二. 联合主键

假设我们的User对象需要两个联合主键,那么就要这么做:
先创建一个类,包含这两个字段,并且实现Serializable接口,还要使用这个两个字段重写hashCode和equals方法:
public class UserKey implements Serializable {private int id;private String uuid;public UserKey() {}public UserKey(int id, String uuid) {super();this.id = id;this.uuid = uuid;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUuid() {return uuid;}public void setUuid(String uuid) {this.uuid = uuid;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + id;result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;UserKey other = (UserKey) obj;if (id != other.id)return false;if (uuid == null) {if (other.uuid != null)return false;} else if (!uuid.equals(other.uuid))return false;return true;}}
然后在User类中,添加这个UserKey成员变量,复写get和set方法。
在配置文件的class标签内,添加<composite-id>标签:
<hibernate-mapping package="com.thr.hibernate.entity"><span style="white-space:pre"></span><class name="User" table="T_USER" lazy="true"><span style="white-space:pre"></span><composite-id name="id" class="UserKey"><span style="white-space:pre"></span><key-property name="id" /><span style="white-space:pre"></span><key-property name="uuid" /><span style="white-space:pre"></span></composite-id><span style="white-space:pre"></span><property name="username" /><span style="white-space:pre"></span><property name="sex" /><span style="white-space:pre"></span><properties name="age" /><span style="white-space:pre"></span><property name="birthday" /><span style="white-space:pre"></span><property name="salary" /><span style="white-space:pre"></span></class></hibernate-mapping>
编写测试方法,插入数据:
public void testCombined() {User user = new User();user.setUsername("张三");user.setSex("男");user.setAge(27);user.setBirthday(new Date());user.setSalary(100.5);user.setId(new UserKey(3, "呵呵"));Session session = HibernateUtil.getSession();// 创建及开启事务对象Transaction trans = null;try {trans = session.beginTransaction();// 添加User实体对象session.save(user);trans.commit();} catch (HibernateException e) {trans.rollback();e.printStackTrace();} finally {HibernateUtil.closeSession(session);}}
查询方法:
public void testCombined2() {Session session = HibernateUtil.getSession();// 创建及开启事务对象Transaction trans = null;try {trans = session.beginTransaction();User user = (User) session.get(User.class, new UserKey(2, "呵呵"));System.out.println(user);trans.commit();} catch (HibernateException e) {trans.rollback();e.printStackTrace();} finally {HibernateUtil.closeSession(session);}}

三. 普通属性映射

属性映射即根据配置文件中的属性来生成数据库表。
首先来看一下现在的配置文件:
<class name="User" table="T_USER" lazy="true"><id name="id"><generator class="increment" /></id><property name="username" access="field" update="false" type="string"length="50" unique="true" not-null="true" /><property name="sex" type="string" length="2" /><property name="age" /><property name="birthday" /><property name="salary" /><property name="user" column="_user" /></class>

1. column

配置这个属性意思是当数据库有列名冲突的时候,配置这个属性可以使用column中的值来创建数据库。

2. unique

表示这个字段是唯一的,负责就要报错。

3. not-null

不为空,负责就要报错。

4. insert/update

配置这个表示这个字段不允许增加/更新,否则报错。

5. access

配置这个为field表示,在数据存储的时候是直接通过属性值来获取的;如果没有配置这个,那么是通过get和set方法来获取的。

四. 特殊属性类型

1. text

使用text可以存很长的字符,给User新增加story属性。
<property name="story" type="text" />

2. binary

使用binary可以存储更大的一些例如音乐等文件:
<property name="music" type="binary" length="90000000" />
看一下是如何存储音乐和读取音乐的:
public void testProperty3() {Session session = HibernateUtil.getSession();// 创建及开启事务对象Transaction trans = null;try {trans = session.beginTransaction();User user = new User();user.setUsername("张三");user.setSex("男");user.setAge(27);user.setBirthday(new Date());user.setSalary(100.5);user.setUser("user");user.setStory("这是一本小说很长很长很长。。。");user.setMusic(FileUtils.readFileToByteArray(new File("D:/09. 灰.mp3")));// 添加User实体对象session.save(user);trans.commit();} catch (Exception e) {trans.rollback();e.printStackTrace();} finally {HibernateUtil.closeSession(session);}}public void testProperty4() {Session session = HibernateUtil.getSession();// 创建及开启事务对象Transaction trans = null;try {trans = session.beginTransaction();User user = (User) session.get(User.class, 1);FileUtils.writeByteArrayToFile(new File("d:/my.mp3"),user.getMusic());trans.commit();} catch (Exception e) {trans.rollback();e.printStackTrace();} finally {HibernateUtil.closeSession(session);}}

五. 多对一关联映射















 

0 0