映射配置:
一、普通字段映射
<?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">
<!-- 映射文件:映射一个实体类对象;描述一个对象最终实现可以直接保存对象的数据到数据库中。 -->
<!--
package:要映射的对象所在的包(可选,不写也行,但是如果不指定,此文件下面所有的类(class)都要指定全路径)
auto-import:默认值为true,在写hql的时候 自动导入包名
如果改为false,再写hql的时候必须写上类的全名
如,查询语句:session.createQuery("from sram.hbm_config.Employee").list();
-->
<hibernate-mapping package="sram.hbm_config" auto-import="true">
<!--
class 映射某一个对象的,可以写多个class
(但是一般情况,一个对象写一个映射文件,即一个class节点)
name:指定要映射的对象类型
talbe:对象对应的表。可以省略不写。
如果没有指定表名,默认与对象属性名一致
-->
<class name="Employee" table="employee">
<!-- 主键,映射 -->
<id name="empId" column="id">
<generator class="native"/>
</id>
<!--
普通字段映射
property
name:指定对象的属性名称
column:指定对象属性对应的表的字段名称。
可以省略不写,如果不写,默认与对象属性名一致
length:指定字符的长度。注意:仅能字符使用
可以省略不写,默认为255
type:指定映射表的字段类型,可以省略不写。
如果不指定,会匹配属性的类型
java类型:必须写全名,如type="java.lang.String"
hibernate类型:直接写类型,如type="sting"(注意:必须都是小写)
-->
<property name="empName" column="empName"></property>
<property name="workDate" column="workDate"></property>
<!-- 如果列名称为数据库关键字,那么需要使用反引号(`,输入法为英文状态下的~键不加shift)或改变类名 -->
</class>
</hibernate-mapping>
二、主键映射
主键生成策略,查看api:
hibernate-distribut3.6.0.Final/documentation/manal/zh-CN 目录下的任意API
5.1.2.2.1.Various additional generators
1、单列主键映射
<class name="Employee" table="employee">
<!-- 主键,映射 -->
<id name="empId" column="id">
<!--
主键生成策略
identity 自增长(mysql、db2)
最常用的 native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
如果是mysql数据库,采用的自增长方式是identity
如果是oracle数据库,采用的sequence序列的方式实现自增长
sequence 自增长(序列)oracle中自增长是以序列方法实现的,Oracle中使用,可以多表使用,但是序列就不连续了
increment 自增长(会有并发访问的问题,一般在服务器集群环境下会存在问题)
assigned 指定主键生成策略为手动指定主键的值
uuid 指定uuid随机生成的唯一的值(使用这种方式主键的数据类型只能为String)
foreign (外键方式, one-to-one时再说)
-->
<generator class="native"/>
</id>
2、多列作为主键映射
1)引入:
数据库:
a)一个表能否有多个主键? 不能。
b)为什么要设置主键? 数据库存储的数据都是有效的,必须保持唯一。
c)为什么把id作为主键?
因为表中通常找不到合适的列作为唯一列即主键,所以为了方法用id列,因为id是数据库系统维护可以保证唯一,所以就把这列作为主键!
2)联合/复合主键
CREATE TABLE t(
t1 INT,
t2 INT
msg VARCHAR(20)
PRIMARY KEY(t1,t2)
)
如果找不到合适的列作为主键,除了用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性。
3)代码举例:
a)CompositeKeys.java
b)User.java
c)User.hbm.xml
d)测试类App2.java
package sram.compositeKey;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class App2 {
private static SessionFactory sf;
static{
//创建sf对象
sf = new Configuration()
.configure()
.addClass(User.class) //(测试使用)会自动加载映射文件 Employee.hbm.xml
//但只能加载当前目录下与Employee.class类名一样的映射文件
.buildSessionFactory();
}
//保存对象
@Test
public void testSave() throws Exception{
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//对象
CompositeKeys keys = new CompositeKeys();
User user = new User();
keys.setAddress("北京市海淀区1-1");
keys.setUserName("Endeavor");
user.setAge(22);
user.setKeys(keys);
//保存
session.save(user);
tx.commit();
session.close();
}
}
4)效果:
a)执行sava()保存
b)执行get()方法查询