Hibernate---我的Hibernate学习笔记(二)

2014-11-24 01:08:47 · 作者: · 浏览: 6

2.hibernate.cfg.xml的样板:

Xml代码 \

    jdbc:mysql://localhost:3306/test com.mysql.jdbc.Driver root password update true org.hibernate.cache.EhCacheProvider false false org.hibernate.dialect.MySQLDialect mysql 1 thread

步骤五:使用Hibernate API

Java代码 \

    //读取Hibernate.cfg.xml配置文件,并读到内存中为后续操作作准备 Configuration config = new Configuration().configure(); //SessionFactory缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。 SessionFactory sessionFactory = config.buildSessionFactory(); //Session是持久层操作的基础,相当于JDBC中的Connection。 Session session = sessionFactory.openSession(); try{ 原子性,必须捕捉异常。所有事务都放在这一代码块里。 //操作事务时(增、删、改)必须显式的调用Transaction(默认:autoCommit=false)。 Transaction tx = session.beginTransaction(); for(int i=0; i<=1000; i++){ Student stu = new Student(...); session.save(stu);//set value to stu //批量更新:为防止内存不足,分成每20个一批发送过去。 if(i%20==0){session.flush();session.clear();}//不是大批量更新,则不需要写这一行 //默认时,会自动flush:查询之前、提交时。 } tx.commit();//提交事务,Hibernate不喜欢抛异常,如有需要,自己捕捉。 //查询方法。如果有必要,也可以用事务(调用Transaction) String hql = "from Student s where s.stuNo like and s.Sal > ";//Student是类而不是表 List list = session.createQuery(hql) .setString(0, "a00_").setDouble(1, 3000.0)//设置HQL的第一二个问号取值 .list();//Hibernate里面,没有返回值的都默认返回List StringBuffer sb = new StringBuffer(); for(Student st :(List )list){//(List )强制类型转换 sb.append(st.getOid()+" "+st.getName()+"\n");//拿到Student类里的属性 }System.out.print(sb.toString());//直接打印sb也可以,它也是调用toString,但这样写效率更高 } catch (HibernateException e) { e.printStackTrace(); session.getTransaction().rollback();//如果事务不成功,则rollback } finally { session.close();//注意关闭顺序,session先关,Factory最后关(因为它可以启动多个session) sessionFactory.close();//关闭SessionFactory,虽然这里没看到它,但在HbnUtil里开启了。 }

五、 Hibernate主键策略(上面的步骤三的一部分)

主键:在关系数据库中,主键用来标识记录并保证每条记录的唯一性(一般可保证全数据库唯一)。必须满足以下条件:

1)不允许为空。

2)不允许主键值重复。

3)主键值不允许改变。

1.自然主键:以有业务含义的字段为主键,称为自然主键。

优点:不用额外的字段。

缺点:当业务需求发生变化时,必须修改数据类型,修改表的主键,增加了维护数据库的难度。

2.代理主键:增加一个额外的没有任何业务含义的一般被命名为ID的字段作为主键。

缺点:增加了额外字段,占用部分存储空间。

优点:提高了数据库设计的灵活性。

Hibernate用对象标识(OID)来区分对象:

Student stu = (Student)session.load(Student.class,101); //这代码加载了OID为101的Student对象

Hibernate推荐使用代理主键,因此Hibernate的OID与代理主键对应,一般采用整数型,包括:short、int、long。

1、主键生成策略: (Hibernate支持多种主键生成策略)

generator节点中class属性的值:

1) assigned:assigned:由用户自定义ID,无需Hibernate或数据库参与。是 元素没有指定时的默认生成策略。

2) hilo:通过hi/lo(高/低位)算法生成主键,需要另外建表保存主键生成的历史状态(这表只需要一个列和高位初始值)。

hi/lo算法产生的标识只在一个特定的DB中是唯一的。所有数据库都可用。

如果同一个数据库里多张表都需要用;可以建多张主键表,也可以共用同一字段,但最好是用同一张主键表的不同字段。

high_val

nextval

5

3) sequence:采用数据库提供的Sequence机制。

Oracle,DB2等数据库都提供序列发生器生成主键,Hibernate也提供支持。

序列名

4) seqhilo:功能同hilo,只是自动建表保存高位值。主键生成的历史状态保存在Sequence中。

只能用于Oracle等支持Sequence的数据库。

high_val_seq

5

5) increment:主键按数值顺序递增。

作用类型:long,short,int

使用场景:在没有其他进程同时往同一张表插数据时使用,在cluster下不能使用

6) indentity:采用数据库提供的主键生成机制。特点:递增。(Oracle不支持)

通常是对DB2,Mysql, MS Sql Server, Sybase, Hypersonic SQL(HSQL)内置的标识字段提供支持。

返回类型:long,short, int

注:使用MySql递增序列需要在数据库建表时对主健指定为auto_increment属性。用Hibernate建表则不需要写。

(oid int primary key auto_increment)

7) native:由Hibernate根据底层数据库自行判断采用indentity, hilo或sequence中的一种。

是最通用的实现,跨数据库时使用。Default.sequence为hibernate_sequence

8) foreign:由其他表的某字段作为主键,通常与 联合使用;共享主健(主键与外键),两id值一样。

car

9) UUID:

uuid.hex:由Hibernate基于128位唯一值产生算法生成十六进制数(长度为32的字符串---使用了IP地址)。

uuid.string:与uuid.hex一样,但是生成16位未编码的字符串,在PostgreSQL等数据库中会出错。

特点:全球唯一;ID是字符串。

10)select:通过DB触发器(trigger)选择一些唯一主键的行,返回主键值来分配主键

11)sequence-identity:特别的序列发生策略,使用DB序列来生成值,通常与JDBC3的getGenneratedKeys一起用,使得在执行insert时就返回生成的值。Oracle 10g(支持JDK1.4)驱动支持这一策略。

2、复合主键策略

步骤一:创建数据库表,设定联合主键约束

步骤二:编写主持久化类以及主键类;编写主键类时,必须满足以下要求:

1)实现Serializable接口

2)覆盖equals和hashCode方法

3)属性必须包含主键的所有字段

步骤三:编写*.hbm.xml配置文件

六、 Hibernate的查询方案(应该熟悉各种查询的使用方法)

1、利用Session接口提供的load方法或者get方法

2、Hibernat