1>Hibernate三种状态:transient(瞬时状态),persistent(持久化状态)以及detached(离线状态)java
2>Hibernate延迟加载:session.get() -> 即时加载 ; session.load();延迟加载;在超出数据库表中数据查询的范围的时候,get方法会抛出空指针异常,load会抛出对象为空异常web
3>ID生成策略:数据库
native/autoapi
根据不一样的数据库采用不一样的ID生成方式,例如:在SQL Server中采用identity; 在MySQL中采用auto_increment; 在ORACLE中就会采用sequence, 注意hibernate会自动帮你建立一个名字叫hibernate_sequence的序列,不用本身去建立.这也是最经常使用和省事的.session
4>Hibernate注解:app
注解的方式与xml很不少相似:ide
首先是须要加入4个jar包:hibernate-commons-annotations.jar 、 hibernate-annotations.jarfetch
ejb3-persistence.jar 、 hibernate-jpa-2.0-api-1.0.1.Final.jarui
下面是不一样的地方:spa
(1):hibernate.hbm.xml 文件中把引用:xxx.hbm.xml改成引用实体类:
即把:<mapping resource="com/wsw/hibernate/model/Person.hbm.xml"/>
改成:<mapping class="com.wsw.hibernate.model.Teacher" />
(2):获取SessionFactory方式发生了变化:
即:由SessionFactory sf = new Configuration().configure().buildSessionFactory()
改成:SessionFactory sf = new AnnotationConfiguration().configure().buildSessionFactory()
(3):注解方式不须要在xxx.hbm.xml把实体类与表进行映射。而采用在实体类中进行注解。
注意:(1):若是实体类属性名与表字段名不一致的时候,要么都注解在属性前,要么都注解在get方法前。不能部分注解在属性前,部分注解在方法前。
(2):若是实体类属性名与表字段名一致的时候,能够部分注解在属性前,部分注解在方法前。
(3):若是在实体类中某些属性不注解:(属性和get都不写注解),默认为表字段名与实体类属性名一致。
(4):若是实体类的某个成员属性不须要存入数据库中,使用@Transient 进行注解就能够了。即相似于:(xxx.hbm.Xml配置中的某些字段不写(就是不须要对这个成员属性进行映射))
(5):表名称能够在实体类前进行注解。
(6):全部这些注解在:javax.persistence包下。而不是在hibernate包中。
经常使用的hibernate annotation标签以下:
@Entity --注释声明该类为持久类。将一个Javabean类声明为一 个实体的数据库表映射类,最好实现序列化.此时,默认状况下,全部的类属性都为映射到数据表的持久性字段.若在类中,添加另外属性,而非映射来数据库的, 要用下面的Transient来注解.
@Table(name="promotion_info") --持久性映射的表(表名="promotion_info).@Table是类一级的注解,定义在@Entity下,为实体bean映射表,目录和schema的名字,默认为实体bean的类名,不带包名.
@Id--注释能够代表哪一种属性是该类中的独特标识符(即至关于数据表的主键)。
@GeneratedValue --定义自动增加的主键的生成策略.
@Transient --将忽略这些字段和属性,不用持久化到数据库.适用于,在当前的持久类中,某些属性不是用于映射到数据表,而是用于其它的业务逻辑须要,这时,须将这些属性进行transient的注解.不然系统会因映射不到数据表相应字段而出错.
@Temporal(TemporalType.TIMESTAMP)--声明时间格式
@Enumerated --声明枚举
@Version --声明添加对乐观锁定的支持
@OneToOne --能够创建实体bean之间的一对一的关联
@OneToMany --能够创建实体bean之间的一对多的关联
@ManyToOne --能够创建实体bean之间的多对一的关联
@ManyToMany --能够创建实体bean之间的多对多的关联
@Formula --一个SQL表达式,这种属性是只读的,不在数据库生成属性(可使用sum、average、max等)
@OrderBy --Many端某个字段排序(List)
Hibernate 可以出色地自动生成主键。Hibernate/EBJ 3 注释也能够为主键的自动生成提供丰富的支持,容许实现各类策略。
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码能够明显看出.
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增加型)
AUTO:主键由程序控制。
在指定主键时,若是不指定主键生成策略,默认为AUTO。
@Id
至关于
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
identity:
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很经常使用)。
Oracle就要采用sequence了.
同时,也可采用uuid,native等其它策略.(相关用法,上网查询)
在一对多注解中,会用到:
"一"方:
@OneToMany --> mappedBy:"多"方的关联属性(被控方)
"多"方:
@ManyToOne --> @JoinColumn,"多"方定义的外键字段.
如数据表定义外键以下:
FOREIGN KEY (classid) REFERENCES classes(id)
则:
@JoinColumn(name="classid")
在双向关联中,有且仅有一端做为主体(owner)端存在:主体端负责维护联接列(即更新),对于不须要维护这种关系的从表则经过mappedNy属性进行声明。mappedBy的值指向另外一主体的关联属性。例子中,mappedBy的值为classes。
mappedBy至关于过去的inverse="true".
inverse=false的side(side实际上是指inverse=false所位于的class元素)端有责任维护关系,而inverse=true端无须维护这些关系。
cascade与fetch使用说明:
Cascade
CascadeType.PERSIST (级联新建)
CascadeType.REMOVE (级联删除)
CascadeType.REFRESH (级联刷新)
CascadeType.MERGE (级联更新)中选择一个或多个。
CascadeType.ALL
fetch属性:
关联关系获取方式,便是否采用延时加载。
LAZY(默认值)采用延时加载,查询数据时,不一块儿查询关联对象的数据。而是当访问关联对象时(如:getStudnets()时)才触发相应的查询操做,获取关联对象数据。
EAGER:是在查询数据时,也直接一块儿获取关联对象的数据。
多对多注解:
在多对多注解中,双方都采用@ManyToMany.
其中被控方,像一对多注解中设置同样,也要设置mappedBy.
其中主控方,不像一对多注解那样,采用@joinColumn,而是采用@joinTable.以下:
@JoinTable(name="j_student_course" ,joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="cid")})
其中,
如上所说,mappedBy,至关于inverse="true".因此,在@joinTable中的inverseJoinColumns中定义的字段为mappedBy所在类的主键.joinColumns定义的字段,就是当前类的主键.