【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方法:
先创建一个类,包含这两个字段,并且实现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
- 【Hibernate3】(3)数据库生成策略
- Hibernate3主键生成策略
- 数据库主键生成策略
- 数据库主键生成策略
- 数据库主键生成策略
- 数据库主键生成策略
- 6.数据库生成表策略
- Hibernate 第五讲 数据库Id生成策略 (3)
- hibernate3命名策略
- Hibernate3.2(6):利用hbm2ddl.auto生成数据库表
- hibernate3第二章之JUNIT简单单元测试、CRUD、三种状态、主键生成策略
- Oracle数据库采用那种主键生成策略
- 数据库主键生成策略 方法集合
- Activiti 数据库表自动生成策略
- 数据库分库分表(sharding)---全局主键生成策略
- 数据库分库分表(sharding)系列——全局主键生成策略(3)
- hibernate3(3)
- Hibernate3.2(3):Hibernate的数据库操作总结
- 一些移动开发的前端框架分享
- HDOJ 1302-The Snail
- Fld selectn for mvmt type 551 / acct 400001 differs for Customer goods movement (015) Message no. M7
- java类加载的先后顺序
- SQL Server审计功能入门:SQL Server审核 (SQL Server Audit)
- 【Hibernate3】(3)数据库生成策略
- 文档的编码格式问题
- 你真的理解大数据吗?
- 下拉刷新
- 属性动画要素(简记)
- [leetcode] 21. Merge Two Sorted Lists 解题报告
- Unity 自定义地形(可刷地形、材质和种树)(一)
- Android中BroadCastReceiver使用
- 【引用】 着色语言比较,以及HLSL VS GLSL VS CG