Hibernate知识点

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

首先是须要加入4jar包: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定义的字段,就是当前类的主键.

相关文章
相关标签/搜索