配置文件 Hibernate基本映射dtd 1. Name (可选):持久化类(或接口)的java全限定名。如果这个属性不存在,Hibernate将假定这是一个非pojo的实体映射。 2. table(可选-默认是类的权限定名):对应的数据库名。 3. Discriminator value (可选-默认和类名一样):一个拥有区分不同的子类的值,在多台行为时使用。他可以介绍的值包括null和not null。 4. schema(可选):覆盖在根<hibernate – mapping>元素中指定的schema名字。 5. catalog(可选): 覆盖在<hibernate-mapping>元素中制定的catolog名字。 6. proxy (可选): 指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。 7. dynamic-update(可选,默认为false):指定用于update的sql将会在运行时动态生成,并且包含那些非空值字段 8. select-before-update(可选,默认为false): 指定Hibernate除非确定对象真正被修改(如果该值为true)否则不会执行sql-update操作。在特定场合(实际上,他只是一个瞬时对象(Transient object)关联到一个新的session中执行的update。这说明Hibernate会在update之前执行一次额外的sql select 操作来据定和司法应该执行update。 Hibernate对象: 对象数据库关系映射工具。把对象映射到数据库中。 对象标示,实体为对相爱模型。将实体关联到数据库中的表。 OOA : 面向对象分析 OOD : 面向对像设计 OOP :面向对象编程 实体类---表 •实体类中的普通属性---表字段 •采用<class>标签映射成数据库表,通过<property>标签将普通属性映射成表字段 •所谓普通属性指不包括自定义类、集合和数组等 注意:如果实体类和实体类中的属性和sql中的关键字重复,必须采用table或column重新命名 •实体类的设计原则: * 实现一个默认的(即无参数的)构造方法(constructor) * 提供一个标识属性(identifier property)(可选) * 使用非final的类 (可选) * 为持久化字段声明访问器(accessors) •主键生成策略: uuid、native和assigned hibernate二级缓存 • 二级缓存也称进程级的缓存或SessionFactory级的缓存,二级缓存可以被所有的session共享 二级缓存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二级缓存 •二级缓存的配置和使用: * 将echcache.xml文件拷贝到src下 * 开启二级缓存,修改hibernate.cfg.xml文件 <property name="hibernate.cache.use_second_level_cache">true</property> * 指定缓存产品提供商,修改hibernate.cfg.xml文件 <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> * 指定那些实体类使用二级缓存(两种方法) * 在映射文件中采用<cache>标签 * 在hibernate.cfg.xml文件中,采用<class-cache>标签 •二级缓存是缓存实体对象的 •了解一级缓存和二级缓存的交互 Component(组成,构成)映射 • hibernate中,component是某个实体的逻辑组成部分,它与实体的根本区别是没有oid, • component可以成为是值对象(DDD) •采用component映射的好处:它实现了对象模型的细粒度划分,层次会更分明,复用率会更高 • 复合(联合)主键映射 通常将复合主键相关的属性,单独放到一个类中 * 此类必须实现序列化接口 * 覆写hashcode和equals方法 每棵继承树映射成一张表(hibernate_extends_1) 1. 理解如何映射 a) 因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分那些记录是属于那个类的。这种机制就是在表中添加一个字段,用这个字段的值来进行区分。用Hibernate实现这种策略的时候,有如下步骤: • 父类用普通的<class>标签定义。 在父类中定义一个discriminator(鉴别器),即指定这个区分的字段的名称和类型如:<discriminator column= 字段 type = 字段类型 /> • 子类使用 <subclass>标签定义,在定义subclass的时候,需要注意如下几点: a )subclass标签的name属性是子类的全路径名, 在subclass标签中,用discriminator-value属性来表明本子类的discriminator字段(用来区分不同类的字段)的只subclass标签,即可以被class标签所包含(这种包含关系正是表明了类之间的继承关系),也可以与class标签平行。当subclass标签的定义与class标签平行的时候,需要在subclass标签中添加extends属性,里面的值是父类的全路径名称。子类的其他属性,像普通类一样,定义在subclass标签的内部。 b) 理解如何存储 • 存储的时候hibernate会自动将鉴别字段值插入到数据库中,在加载数据的时候,hibernate能根据这个鉴别值正确的加载对像。 多台查询:在hibernate加载数据的时候能鉴别出正真的类型(instanceof) Get支持多台查询 Load 只有在lazy=false,才支持多态查询 Hql 支持多态查询 每一个子类映射成一张表(bibernate_extends_2) 1. 理解如果映射 a) 这种策略是使用joined-subclass 标签来定义子类的。父类 、子类、每个类对应一张数据库表。 b) 在父类中对应的数据库表,实际上会存储所有的记录,包括父类和子类的记录;在子类对应的数据库表中。这个表只定义了子类中所特有的属性映射的字段。子类和父类通过相同的主键值来关联。实现这种策略的时候,有如下步骤: •父类用普通的<class>标签定义即可 •父类不再需要定义discriminator 字段 •子类用 <joined-subclass>标签定义,在定义joined-subclass的时候。需要注意如下几点: 1. Joined-subclass标签的name属性是子类的全路径名 2. joined-subclass标签需要包含一个key标签,这个标签指定了子类和父类之间是通过哪个字段来关联的。如: <key column= “parent_key_id” />,这里的column实际上就是父类的主键对应的映射字段名称。 3. joined-subclass 标签即可以被class标签所包含(这种包含关系正式表明了类之间的继承关系),也可以与class标签平行。当joined-subclass标签的定义与class标签平行的时候。需要在joined-subclass标签中添加extends属性。里面的值是父类的全路径名称。子类的其他属性,像普通类一样,定义在joined-subclass标签的内部。 每一个具体类映射成一张表(hibernate_extends_3) 1. 理解如何映射 a) 这种策略是使用了union-subclass标签来定义子类的。每一个类对应一张表,而且这个表的信息是完备的。即包含了所有从父类下来的属性映射的字段(这就是它跟joined-subclass)的不同之处。 b) joined-subclass定义的子类的表,只包含子类特有属性映射的字段。实习这种策略的时候,有如下步骤: 1. 父类用普 <class> 标签定义即可 2. 子类用<union-subclass>标签定义,在定义union-subclass的时候,需要注意以下几点; a) Union-subclass标签不再需要包含key标签(与joined-subclass不同) b) Union-subclass标签即可以被class标签所包含(这中包含关系正是表明了类之间的继承关系)。也可以与class标签平行。当union-subclass标签的定义与class标签平行的时候,需要在union-subclass标签中添加extends属性。里面的值是父类的全路径名称。子类的其他属性,像普通类一样,定义在union-subclass标签的内部。这个时候,虽然在union-subclass里面定义的只有子类的属性,但是因为他继承了父类,所以,不需要定义其他的属性。在映射到数据库表的时候,依然包含了父类的所有属性的映射字段。 注意:在保持对象的时候id是不能重复的(不能使用自增生成主键)