1.对持久化类提供一个无参数的构造方法 — Hibernate需要使用凡是生成实例
2.属性需要私有,对私有属性提供get和set方法 — Hibernate中获取,设置对象的值
3. 对持久化类提供一个唯一标识OID与数据库主键对应 — Java中通过对象的地址区分是否同一个对象,数据库中通过主键确定是否是同一个记录,而在Hibernate中通过持久化类的OID的属性区分是否是同一个对象
4. 持久化类中属性尽量使用包装类 — 因为基本数据类型默认是0,包装类默认值是null (int => Integer,long=>Long,double=>Double)
5. 持久化类不能使用final进行修饰 — 延迟加载本身是Hibernate一个优化的手段,返回的是一个代理对象(Javassist),如果不能继承,不能产生代理对象,延迟加载也就会失败,load方法和get方法将会一样.
在映射文件中配置
<id name="cust_id" column="cust_id">
<generator class="native"/>
</id>
public void demo1() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer(); //瞬时态 : 没有唯一的标识OID,没有被session管理
customer.setCust_name("张三");
Serializable id = session.save(customer);//持久态 : 有唯一的标识OID,被session管理
transaction.commit();
session.close();
System.out.println(customer.getCust_name());//托管态 : 有唯一的标识OID,不被session管理
}
站在三种状态角度看saveOrUpdate()方法
public void demo2() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
/*当为瞬时态对象时执行save方法*/
/*Customer customer = new Customer();
customer.setCust_name("张三");
session.saveOrUpdate(customer);*/
/*当为托管态对象时执行update方法*/
Customer customer = new Customer();
customer.setCust_id(3l);
customer.setCust_name("李四");
session.saveOrUpdate(customer);
transaction.commit();
session.close();
}
持久态对象特性 : 持久态对象自动更新数据库
public void demo3() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = session.get(Customer.class, 3l);
customer.setCust_name("王五");
//不用执行update方法,持久态对象自动更新数据库
//session.update(customer);
transaction.commit();
session.close();
}
证明一级缓存的存在
public void demo4() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer1 = session.get(Customer.class, 1l);//发送SQL语句
System.out.println(customer1);
Customer customer2 = session.get(Customer.class, 1l);//不发送SQL语句
System.out.println(customer2);
transaction.commit();
session.close();
}
一级缓存的特殊区域 : 快照区
在Hibernate核心文件hibernate.cfg.xml中配置
<!--
事务隔离级别
1 -> Read uncommitted
2 -> Read committed
4 -> Repeatable read
8 -> Serializable
-->
<property name="hibernate.connection.isolation">4</property>
public static Session getCurrentSession() {
return sf.getCurrentSession();
}
在核心文件hibernate.cfg.xml中配置
<!-- 配置当前线程绑定的Session -->
<property name="hibernate.current_session_context_class">thread</property>
@Test
/*
* Query
*/
public void demo4() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//简单查询
// String hql = "from Customer";
// Query query = session.createQuery(hql);
//条件查询
// String hql = "from Customer where cust_name like ?";
// Query query = session.createQuery(hql);
// query.setParameter(0, "王%");
//分页查询
String hql = "from Customer";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(3);
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
@Test
/*
* Criteria
*/
public void demo5() {
Session session = HibernateUtils.getCurrentSession();
Transaction tx = session.beginTransaction();
//简单查询
// Criteria criteria = session.createCriteria(Customer.class);
//条件查询
// Criteria criteria = session.createCriteria(Customer.class);
// criteria.add(Restrictions.like("cust_name", "张%"));
// criteria.add(Restrictions.like("cust_name", "张",MatchMode.ANYWHERE));
//分页查询
Criteria criteria = session.createCriteria(Customer.class);
criteria.setFirstResult(0);
criteria.setMaxResults(3);
List<Customer> list = criteria.list();
for (Customer customer : list) {
System.out.println(customer);
}
tx.commit();
}
本文地址:https://blog.csdn.net/a1669820631/article/details/107296075
如对本文有疑问, 点击进行留言回复!!
ScrollView和RecyclerView的滑动事件处理
配置JAVA环境+安装Android Studio全过程+踩坑记录
Android P Camera2当SD卡被拔出来自动切换到内部存储
android 多个edittext 判空监听 让Button动态是否可点击
Android开源项目滚轮选择器WheelPicker的基本用法总结
网友评论