【Java】Hibernate(四)对象/关系数据库映射基础
程序员文章站
2022-04-03 08:04:37
...
【映射】
对象和关系数据库之间的映射通常是用一个XML文档来定义的。映射文档被设计为易读的,并且可以手工修改。映射语言以Java为中心,这就意味着映射文档是按照持久化类的定义来创建的,而非表的定义。第一篇概述博客中,我们简要总结了Hibernate开发步骤,首先创建持久化类。 然后创建对象-关系映射文件,*.hbm.xml。创建Hibernate配置文件,hibernate.cfg.xml,最后编写访问数据库的代码。按照这个流程,总结下各步骤具体的使用细节。
【实体类设计原则】
1.实现无参的默认构造函数
2.提供一个标识
3.不要使用final修饰实体类。因为final的类不能被继承。
4.生成 getter setter方法
【*hbm.xml映射文件解读】
拿下面的代码举个例子<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="User1" table="t_user1">
<id name="id" column="user_id" length="32">
<generator class="uuid"/>
</id>
<property name="name" length="30" unique="true" not-null="true"/>
<property name="password"/>
<property name="createTime" type="date" column="create_time"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
标签介绍:
☆Doctype:所有的xml映射都要定义doctype,DTD可以从上面的URL中获取。☆ hibernate-mapping:这个属性包括一些可选的属性。上面的例子中就用到了package属性,指定了包前缀。Hibernate-mapping元素允许嵌套多个<class>映射,但是最好还是一个持久化类对应一个映射文件。
☆class:实体类到表,就采用class标签映射,该元素就是来定义持久化类的,它的属性很丰富。
用过属性的介绍几个:
name:为持久化类的名称。
table:对应数据库表名。
proxy:指定一个接口,在延迟加载时作为代理使用,可以使用该类自己的名字。
lazy:用来体现延迟加载。
abstract: 用于在<union-subclass> 继承结构中标识抽象超类。
discriminator-value:用来区分不同的子类值,在多态行为时使用,可接受的值包括null和not null。
☆id:定义了该属性到数据库表主键字段的映射。被映射的类必须定义对应数据库表主键字段。name用来标识属性的名字,column为主键字段的名字。
☆generator:一个Java类的名字,用来为该持久化类实例生成唯一标识。如果生成器实例需要某些配置值或初始化参数,用<param>元素传递。所有生成器都实现org.hibernate.id.IdentifierGenerator接口。
主键生成策略简介:
1.Identity:内部支持标识字段的数据库如MySQL SQL,可以使用Identity关键字生成。
2.Sequence:内部支持序列的数据库Oracle等,使用sequence。
3.UUID:用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的,UUID被编码为一个32位16进制数字的字符串。UUID包含了IP地址,JVM启动时间,系统时间和一个计数器值(JVM中唯一)。因为这是Hibernate生成的,和数据库没关系,所以UUID效率快。
4.Native:涵盖identity 和sequence。
5.Assigned:手动分配,如果你需要应用程序分配一个标识符,非hibernate自己生成,就可以使用手动分配。
6.Foreign :拿到关联对象的标识作为自己的主键,使用另外一个相关联的对象的标识符,通常和<one-to-one>联合起来使用。
☆discriminator:在“一棵对象继承树对应一个表”的策略中,该元素是必需的,它定义了表的鉴别器字段。鉴别器字段的实际值是根据<class>和<subclass>元素中discriminator-value属性得来的。后续的继承映射博客会再做介绍。
☆property:实体类中的普通属性(不包括集合。自定义类和数组)对应表的字段。它为类定义了一个持久化的JavaBean风格的属性。采用<property>标签映射如果实体类的名称或实体类中的属性的名称和数据库关键字重复,将会出现问题可以考虑采用table属性和column属性对其进行重新命名。
PS: hibernate.cfg.xml 中hbm2ddl属性设为update,sessionfactory建立的时候,就会自动建表。
<property name="hibernate.hbm2ddl.auto">update</property>
【Hibernate test方法】
public void testSave1(){
Session session =null;
try{
session=HibernateUtils.getSession(); //获得session
session.beginTransaction();//开启事务
session.getTransaction().commit();// 提交事务
}catch(Exception e){
e.printStackTrace();//打印堆栈
session.getTransaction().rollback();//事务回滚
}finally{
HibernateUtils.closeSession(session);//关闭session
}
}
【小结】
后续介绍一对一映射,下篇见~上一篇: OpenGL.Shader:11-阴影实现 - 定向光阴影
下一篇: pygame 实现键盘鼠标映射