Hibernate各类概念总结
1.延迟加载(lazyload)
属性延迟加载:当使用load的方式来获取对象的时候,只有访问了这个对象的属性,hibernate才会到数据库中进行查询。否则不会访问数据库
关系延迟加载:one-many many-many的时候都可以使用关系的延迟加载
2.级联
2.1没有配置级联的时候,删除分类,其对应的产品不会被删除。 但是如果配置了恰当的级联,那么删除分类的时候,其对应的产品都会被删除掉。
2.2级联的四种类型
all:所有操作都执行级联操作;
none:所有操作都不执行级联操作;
delete:删除时执行级联操作;
save-update:保存和更新时执行级联操作;
级联通常用在one-many和many-to-many上,几乎不用在many-one上。
3.一级缓存
hibernate默认是开启一级缓存的,一级缓存存放在session上
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import com.how2java.pojo.Category;
public class TestHibernate {
public static void main(String[] args) {
SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();
System.out.println("log1");
Category c1 = (Category)s.get(Category.class, 1);
System.out.println("log2");
Category c2= (Category)s.get(Category.class, 1);
System.out.println("log3");
s.getTransaction().commit();
s.close();
sf.close();
}
}
第一次通过id=1获取对象的时候,session中是没有对应缓存对象的,所以会在"log1"后出现sql查询语句。
第二次通过id=1获取对象的时候,session中有对应的缓存对象,所以在"log2"后不会出现sql查询语句
4.二级缓存
Hibernate的一级缓存是在Session上,二级缓存是在SessionFactory上。而hibernate本身不提供二级缓存,都是使用第三方的二级缓存插件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.how2java.pojo">
<class name="Category" table="category_">
<cache usage="read-only" />
<id name="id" column="id">
<generator class="native">
</generator>
</id>
<property name="name" />
<set name="products" lazy="true">
<key column="cid" not-null="false" />
<one-to-many class="Product" />
</set>
</class>
</hibernate-mapping>
使用不同的session,都去获取id=1的category,只会访问一次数据库。因为第二次获取虽然没有从第二个session中拿到缓存,但是从sessionfactory中拿到了Category缓存对象
5.乐观锁
<version name="version" column="ver" type="int"></version>
增加一个version字段,用于版本信息控制。这就是乐观锁的核心机制。
比如session1获取product1的时候,version=1。 那么session1更新product1的时候,就需要确保version还是1才可以进行更新,并且更新结束后,把version改为
6.注解
hibernate里常用注解包括,类注解,属性注解,关系注解,其他的注解
6.1类注解@Entity 和 @Table
@Entity 表示这是一个实体类,用于映射表
@Table(name = “product_”) 表示这是一个类,映射到的表名:product_
6.2属性注解
属性注解是配置在属性对应的getter方法上的
@Id 表示这是主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 表示自增长方式使用mysql自带的
@Column(name = “id”) 表示映射到字段id
下一篇: 浅谈swift中类似于C++句柄的语法