注解,配置"/>
Hibernate简介,注解,配置
Hibernate的核心:
Hibernate六大核心接口,两个主要配置文件
1、Configuration接口:负责配置并启动Hibernate
2、SessionFactory接口:负责初始化Hibernate
3、Session接口:负责持久化对象的CRUD操作
4、Transaction接口:负责事务
5、Query接口和Criteria接口:负责执行各种数据库查询
注意:Configuration实例是一个启动期间的对象,一旦SessionFactory创建完成它就被丢弃了。
Hibernate运行过程:
1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件
2.由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取并解析映射信息
3.通过config.buildSessionFactory();//创建SessionFactory
4.sessionFactory.openSession();//打开Sesssion
5.session.beginTransaction();//创建事务Transation
6.persistent operate持久化操作 //一般指Save这个方法
7.session.getTransaction()mit();//提交事务
8.关闭Session
9.关闭SesstionFactory
Hibernate的优/缺点:
优点:
1、更加对象化
以对象化的思维操作数据库,我们只需要操作对象就可以了,开发更加对象化。
2、移植性
因为Hibernate做了持久层的封装,你就不知道数据库,你写的所有的代码都具有可复用性。
3、Hibernate是一个没有侵入性的框架,没有侵入性的框架我们称为轻量级框架。
对比Struts的Action和ActionForm,都需要继承,离不开Struts。Hibernate不需要继承任何类,不需要实现任何接口。这样的对象叫POJO对象。
4、Hibernate代码测试方便。
5、提高效率,提高生产力。
缺点:
1、使用数据库特性的语句,将很难调优
2、对大批量数据更新存在问题
3、系统中存在大量的攻击查询功能
Hibernate基本注解
根据其标注的位置与完成的功能,Hibernate注解可分为两种:类级注解、属性级注解。
. 类级注解:注解在类的头部。完成类到表的映射。
. 属性级注解:注解在属性上面,或属性的get方法上面。完成属性到字段的映射。
- @Entity —— 将一个类声明为一个实体bean(即一个持久化POJO类)
- @Id —— 注解声明了该实体bean的标识属性(对应表中的主键)。
- @Table —— 注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字
- @Column —— 注解声明了属性到列的映射,用来标识实体类中属性与数据表中字段的对应关系该注解有如下的属性 。
name 可选,列名(默认值是属性名)
unique 可选,是否在该列上设置唯一约束(默认值false)
nullable 可选,是否设置该列的值可以为空(默认值false)
insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)
updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)
columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)
table 可选,定义对应的表(默认为主表) length 可选,列长度(默认值255)
precision 可选,列十进制精度(decimal precision)(默认值0) scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)
- @GeneratedValue —— 注解声明了主键的生成策略。该注解有如下属性 strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO
- @OneToOne 设置一对一个关联。cascade属性有五个值(只有CascadeType.ALL好用?很奇怪),分别是CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新),CascadeType.ALL(全部四项)
* 方法一
* 主表: ?@OneToOne(cascade = CascadeType.ALL)
* @PrimaryKeyJoinColumn
* public 从表类 get从表类(){return 从表对象}
* 从表:没有主表类。
* 注意:这种方法要求主表与从表的主键值想对应。
* 方法二
* 主表:?@OneToOne(cascade = CascadeType.ALL)
* @JoinColumn(name="主表外键")//这里指定的是数据库中的外键字段。
* public 从表类 get从表类(){return 从表类}
* 从表:@OneToOne(mappedBy ="主表类中的从表属性")//例主表User中有一个从表属性是Heart类型的heart,这里就填heart
* public 主表类 get主表类(){return 主表对象}
* 注意:@JoinColumn是可选的。默认值是从表变量名+"_"+从表的主键(注意,这里加的是主键。而不是主键对应的变量)。
* 方法三
* 主表:@OneToOne(cascade=CascadeType.ALL)
* @JoinTable( name="关联表名",
* joinColumns = @JoinColumn(name="主表外键"),
* inverseJoinColumns = @JoinColumns(name="从表外键")
* )
* 从表:@OneToOne(mappedBy ="主表类中的从表属性")//例主表User中有一个从表属性是Heart类型的heart,这里就填heart
* public 主表类 get主表类(){return 主表对象}
- * @ManyToOne 设置多对一关联
* 方法一
* @ManyToOne(cascade={CasCadeType.PERSIST,CascadeType.MERGE})
* @JoinColumn(name="外键")
* public 主表类 get主表类(){return 主表对象}
* 方法二
* @ManyToOne(cascade={CascadeType.PERSIST,CascadeType.MERGE})
* @JoinTable(name="关联表名",
* joinColumns = @JoinColumn(name="主表外键"),
* inverseJoinColumns = @JoinColumns(name="从表外键")
* )
- * @OneToMany 设置一对多关联。cascade属性指定关联级别,参考@OneToOne中的说明。fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载
* 方法一 使用这种配置,在为“一端”添加“多端”时,不会修改“多端”的外键。在“一端”加载时,不会得到“多端”。如果使用延迟加载,在读“多端”列表时会出异常,立即加载在得到多端时,是一个空集合(集合元素为0)。
* “一端”配置
* @OneToMany(mappedBy="“多端”的属性")
* public List<“多端”类> get“多端”列表(){return “多端”列表}
* “多端”配置参考@ManyToOne.
* 方法二
* “一端”配置
* @OneToMany(mappedBy="“多端”的属性")
* @MapKey(name="“多端”做为Key的属性")
* public Map<“多端”做为Key的属性的类,主表类> get“多端”列表(){return “多端”列表}
* “多端”配置参考@ManyToOne.
* 方法三 使用这种配置,在为“一端”添加“多端”时,可以修改“多端”的外键。
* “一端”配置
* @OneToMany
* @JoinColumn(name="“多端”外键")
* public List<“多端”类> get“多端”列表(){return “多端”列表}
* “多端”配置参考@ManyToOne.
更多推荐
Hibernate简介,注解,配置
发布评论