Hibernate基础

来源:互联网 发布:蝉知cms 编辑:程序博客网 时间:2024/05/17 08:01

简介:简化ORM映射文件的配置(*.hbm)

JPA与Hibernate:JPA(Java Persistence API)是J2EE的规范标准。JPA是接口,Hibernate是实现。通过hibernate-annotation、hibernate-entityManager和hibernate-core三个组件实现。开发中优先选择JPA的注解

注解分类、schema与catalog

常用类级别注解:@Entity、@Table、@Embeddable

 

hibernate.cfg.xml

配置<session-factory>相关信息:

1.需要配置数据源的账号、密码、驱动、链接、方言。

2.开发常用配置

显示sql语句<propertyname="show_sql">true</property>

格式化sql语句<propertyname="format_sql">true</property>

自动生成表结构<property name="hbm2ddl.auto">update</property>

3.会话

       <property name="hibernate.current_session_context_class">thread</property>


类级别注解

@Entity(name="")

映射的实体类,name是可选的,对应数据库的一张表,若表名与实体类名一样则不用配。使用时需指定实体类的主键属性。

还需在配置文件hibernate.cfg.xml配置注册<mapping class="">

@Table(name="", catalog="", schema="")

与@Entity配合使用,表示实体对应的数据库表的信息。

name,可选,映射表名称,默认一致;catalog,可选,表示Catalog名称,默认为catalog("");schema,可选,表示Schema的名称,默认为schema("")。Table的name属性设定后Entity就不需要设置了

@Embeddable

表示一个非Entity类可以嵌入到另外一个Entity类中作为属性。比如地址信息可以另外声明一个类并注明此注解,在Entity类中常规引用就能使用了

  

属性级别注解

可用在成员变量、也可用在get方法上,但注意必须统一在变量或者方法上注解

@Id

主键属性,在entity中是必须的。如果定义了多个主键,要实现serializable接口。

如果主键是String,则还需在写一个@Column(length=8)注解,有些数据库不支持这么长的主键。

@GeneratedValue(strategy=GenerationType,generator=””)生成策略,

生成器Strategy表示主键生成策略,取值有

GenerationType.AUTO:根据底层数据库自动选择(默认);

GenerationType.INDENTITY:标识列,根据数据库的Identity字段生成的;

GenerationType.SEQUENCE:使用Sequence来决定主键的取值;

GenerationType.TABLE:借助于表实现主键生成策略,还需借助其他注解@TableGenerator(name=”tab_cat_gen”,allocationSize=1)分配的空间大小。

Generator表示主键生成器的名称,这个属性通常和ORM框架相关,如Hibernate可以指定uuid等主键生成方式。

如果要手动赋值主键:不能用JPA的生成策略,要指定一个主键生成器,先写@GeneratedValue(generator=”sid”),然后用Hibernate的@GenericGenerator(neme=”sid”,strategy=”assigned”)这个注解的name属性就是JPA的GeneratedValue注解的generator用来指定生成器的名字,strategy手工复制用assigned。

 @Column(name=””,nullable=””,unique=””,length=””,insertable=””,updateable=””)

对应表的字段名,是否可空值,是否唯一,是否可插入,是否可更新(生日这种数据是不用再更新的)

 @Embedded

如果属性用了Emdedded,则对应的嵌入类必须用@Embeddable接口

 @EmbeddedId

实现复合主键的作用,在实体类的主键属性添加@EmbeddedId,主键的类添加@Embeddable,并且实现Serializable接口、无参的public构造方法、重写equals()和hashCode()。

 @Transient

表示该属性并非映射到数据库字段,ORM将忽略改属性,属性字段不加此注解则默认注解为@Basic

@SequenceGenerator

@Lob

@Version

@Basic

 

关系映射级别注解

先保存外键对象再保存主表对象

一对一单向外键(一个公民一个身份证)

两个注解:写在主控类中

@OneToOne(cascade=CascadeType.ALL)

属性表示级联关系

@JoinColumn(name=”pid”,unique=true)

被控类的外键写入主控类中,name是被控类的主键

被控类要用注解@Entity

添加信息时要先保存被控类(外键信息),再保存主控类(主键信息) 

一对一双向外键关联(一个公民一个身份证)

双方都持有对方的引用,变化主要体现在被控方,在持有对方引用的上面添加@OneToOne(mappedBy=”card”),mappedBy表示指定主控方的外键属性,控制权力给主控方。一对一双向外键关联一定要设置mappedBy,只能交给一方控制

添加信息时要先保存被控类(外键信息),再保存主控类(主键信息)

 一对一单向外键联合主键

创建主键类,实现Serializable,重写equals,hashCode方法

 多对一单向外键关联(多个学生对应一个班级)

多方添加注解

@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)后面的属性是抓取策略

@JoinColumn(name=”cid”,referenceColumnName=”CID”)name属性表示多方持有一方的外键;后面属性表示对应外键能映射成数据库表中的字段,就可以修改其名称

先保存班级信息再保存学生信息

 一对多单向外键关联(一个班级有多个学校)

一方持有多方的集合,一方的集合上添加注解

@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY),一方通常使用懒加载

@JoinColumn(name=”cid”)对应外键的名称

先保存学生信息再保存班级

一对多双向外键关联

多方持有一方的引用

@ManyToOne(cascade={CasecadeType.ALL},fetch=FetchType.EAGER)

@JoinColumn(name=”cid”)

一方持有多方的集合

@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)

@JoinColumn(name=”cid”)

随便先保存班级还是学生

 多对多单向外键关联(学生和教师构成多对多)

一个多方持有另一个多方的集合对象(学生持有教师)

创建中间表,通过注解自动生成,在学生类添加注解

@ManyToMany

@JoinTable(name=””,joinColumn={@JoinColumn(name=”sid”)},inverseJoinColumns{@JoinColumn(name=”tid”)})name是中间表的表名

先保存教师,再保存学生

 多对多双向外键关联

其中一方设置主控方交给另外一方

@ManyToMany(mappedBy=”teachers”)属性写主控方对应的属性名

0 0
原创粉丝点击