Hibernate 基础语义2007-09-02 17:37

Hibernate 基础语义
2007-09-02 17:37


基础语义

Configuration:负责管理Hibernate的配置信息--加载hibernate.cfg.xml文件至内存,作为后续操作基础配置--获取SessionFactory。
Configuration config = new Configuration().configure();
Configuration config = new Configuration().configure("myHibernate.cfg.xml");

SessionFactory:负责创建Session实例.--重用策略--线程安全设计--一个应用中针对一个数据库共享一个SessionFactory实例即可。
SessionFactory sessionFactory = config.bulidSessionFactory():

Session:之于Hibernate,相当于JDBC Connection相对于JDBC。--非线程安全--一个Session实例同时只可由一个线程使用。
Session session = sessionFactory.openSession();

Save:
//新增名为“Emma”的用户记录
TUser user = new TUser();
user.setName("Emma");
session.save(user);

Get:
//假设T_User表中存在id=1的记录
TUser user   = (TUser)session.get(TUser.class,new Integer(1));

Delete:
//假设T_User表中存在id=1的记录
TUser user   = (TUser)session.get(TUser.class,new Integer(1));
session.delete(user);

//也可以通过HQL指定删除条件(Hibernate2)
session.delete("from TUser where id=1");

//通过Query接口进行基于HQL的删除操作(Hibernate3)
String hql = "delete TUser where id=1";
Query query = session.createQuery(hql);
query.executeUpdate();

Find(Hibernate2):
//返回数据库中所有名为“Erica”的用户记录
String hql = "from TUser where name = 'Erica'";
List userList = session.find(hql);

Hibernate3---Query or Criteria 接口进行数据查询。

基础配置---hibernate.cfg.xml

---主要围绕SessionFactory展开。

数据库连接配置:JDBC 和 JNDI。
JNDI:datasource,username,password,dialect。------只适合Web Application。

数据库连接池配置:支持4种连接池实现组件。
默认数据库连接池:hibernate.connection.pool_size 2      ---一般仅用于开发调试。
C3P0,dbcp,Proxool --- 需要指定hibernate.connection.provider_class,推荐使用dbcp。

事务管理
---使用Hibernate的Transaction API--须通过hibernate.transaction.factory_class指定一个Transaction实例工厂类.
JDBC Transaction:JDBCTransactionFactory。
JTA:JTATransactionFactory jta.UserTransaction jta/usertransaction

Hibernate O/R映射

hibernate基本数据类型
实体属性映射---属性数据类型--Java数据类型-->数据库特定数据类型的映射关联(Dialet)。


实体映射
1,实体映射基础---实体类与数据库表之间的映射定义。
类表映射包括:(1),表名-类名映射;(2),主键映射;(3),字段映射。
T_User表
public class TUser implements Serializable{
}
TUser ---TUser.hbm.xml(类与表、类属性与表字段)--- T_User
关于TUser.hbm.xml
类/表映射配置
class name="com.csts.hibernate.db.entity.TUser" table="T_User" ---   每个TUser类对象对应T_User表中的一条记录。
id映射配置
id name="id" column="id" type="java.lang.Integer"
generator class="native"    --- 指定主键生成方式。
---定义了实体类的标识(identity)--对应库表主键的类属性。
从设计角度而言,我们推荐对于每个表都定义一个与业务逻辑无关的"id"字段用作库表记录的唯一标识,而尽量不要将业务逻辑牵扯到数据逻辑中去。
属性/字段映射配置---将映射类属性与库表字段相关联。
property name="name" column="name" type="java.lang.String"
------------经过以上,完成了实体类与库表,实体类属性与库表字段之间的关联关系。

高级映射技术

自定义数据类型---UserType 和 Composite 接口
复合主键---composite-id-->遗留系统中现有复合主键的支持。
Blob,Clob字段的映射

实体映射策略
---设计层面终我们该如何进行规划,这其中有什么比较通用的模式可以借鉴?

实体粒度设计
---细粒度--将原本业务模型中的对象加以细分,从而得到更加精细的对象模型(划分出更多的对象)。
对象的细分目的:1,面向设计的粒度细分(更加清晰的系统逻辑);2,面向性能的粒度细分(提高系统能耗比)。
面向设计的粒度细分:对于单表的对象细分---Component(某个实体对象中的一个逻辑组成)--与实体对象的根本差别在于Component没有标识(identity),完全从属于实体对象。
面向性能的粒度细分:例如Blob,Clob字段的读取---耗性能。---Hibernate3属性的延迟加载--在调用TUser.getResume/getImage时才真正从数据库中读取数据。---Hiberenate2通过继承关系,将一个对象进行纵向细分。--通过polymorphism="explicit"声明显式多态关系,只有在明确指定类名的时候才会返回此类实例,如
List Object = createQuery("from TUserProfile").list();

实体层次设计(类与表)
---TBook,TDVD继承TItem。

继承关系是关系型数据与面向对象数据结构之间的主要差异之一。如何在关系型数据库的基础上,通过继承关系得到清晰合理的层次划分是Hibernate实体层次设计中的一个关键问题。
Hibernate中3种继承形式:
1,表与子类之间的独立一对一关系。
---TBook/T_Book,TDVD/T_DVD可以看作是系统中两个独立的实体映射关系。
缺陷:子随父动;性能低下(查询主类,返回子类所对应的所有库表记录)。
2,每个子类对应一张子表,并与主类共享主表。
面向对象:共性--基类,特性--子类。
---主类一张表记录共性,各子类各一张表记录特性,父子表通过外键关联。Hibernate将根据待保存的数据类型,自动判断采用TItem的哪个子类进行映射。查询时,基于SQL的case子句进行判断。
joined-subclass节点在父类映射文件中对子类TBook,TDVD进行配置。
缺点:多表操作性能消耗大,不利于高并发量的数据存取。
3,表与类的一对多关系。
---冗余字段(将共性字段和子类的特性字段全部放在一张表里面,通过一个冗余字段进行区分不同子类,如增加字段category)。
与普通的单表映射有何区别?怎样体现不同子类之间的差异?---Discriminator
discriminator column="category" type="string"
subclass name="" discriminator-value="" ---根据值判断子类。

数据关联(实体之间)

一对一关联:
1,主键关联---公民与护照,TUser和TPassport设定为基于主键关联的一对一关系。Hibernate中,通过one-to-one节点对一对一关系进行声明。
class name="TUser" table="T_User"
one-to-one name="passport" class=".....TPassport" cascade="all" outer-join="true"
cascade:指的是当主控方执行操作时,关联对象(被动方)能否同步执行统一操作。设定为"all",代表无论主控方执行任何操作都对其关联类进行同样的操作。
只需为一张表设定主键生成器,而另一张表的主键与之共享相同的主键值。在Hibernate中,我们通过"foreign"类型的主键生成器与外键共享主键值。同时,one-to-one节点的constrained属性必须设定为"true",以告知Hibernate当前表主键上存在一个约束.
关联对象的保存:
TUser user = new TUser();
user.setAge(new Integer(20));
user.setName("Carlin");

TPassport passport = new TPassport():
passport.setSerial("PCN756589");
passport.setExpiry(new Integer(20081010));

//相互设置关联
passport.setUser(user);
user.setPassport(passport);

Transaction tx = session.beginTransaction();
//由于TUser 类的one-to-one节点被设置为cascade="all"
//其关联的passport对象将被级联保存
session.save(user);
tx.commit();

关联对象的读取:
TUser user = (TUser)session.load(TUser.class,new Integer(15));
System.out.println("User name:" + user,getName() + "Passport Serial : " + user.getPassport().getSerial());

2,唯一外键关联
T_User中包含一个group_id字段,此字段与T_Group的id字段相关联.
Hibernate中的唯一外键关联由"many-to-one"节点定义。---唯一外键关联的一对一关系只是多对一关系的一个特例。

一对多关联:
one-to-many,采用java.util.Set类型的Collection。
1,单向一对多关联:只需在“一”方进行配置。---为了保持关联关系,只能通过主控方对被动方进行级联更新。--注意被动方有非孔字段导致约束违例。
2,双向一对多关联:需要在关联双方均加以配置。---可以在关联双方中的任意一方,访问关联的另一方。---实际上是"一对多"与"多对一"关联的结合。---在主控方配置单向一对多关系的基础上,在被控方配置与其对应的多对一关系。
inverse="true"---TUser不再作为主控方,而是将关联关系的维护工作交给关联对象TAddress来完成。
inverse="false"的为主动方,由主动方负责维护关联关系。
inverse指关联关系的控制方向,cascade指层级之间的连锁操作。
在one-to-many关系中,将many一方设为主控方(inverse=false)将有助于性能改善(国家元首与人民).

多队多关联:
---需要借助中间表完成多对多映射信息的保存。

cascade设置为"save-update"。
多对多关系必须同时对关联双方进行保存。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值