03-Hibernate对象中的状态
-
hibernate中的实体规则
实体类创建的注意事项:
-
持久化类提供无参的构造方法
-
成员变量私有,提供共有的get、set方法访问,需要提供属性
-
持久化类中的属性,应尽量使用包装类型
-
持久化类需要提供oid与数据库中的主键列对应
-
不要用final修饰class
hibernate使用cglib代理生成对象,代理对象是继承被代理对象。如果被final修饰,将无法生成代理对象
-
-
主键类型
自然主键(少见)
表的业务列中,有某业务列符合,必须有,并且不重复的特征时,该类可以叫做自然主键。
-
代理主键(常见)
表的业务列中,没有某业务列符合,必须有,并且不重复的特征时,创建一个没有业务意义列的作为代理主键。
-
hibernate中的对象状态
对象分为3中状态
-
瞬时状态
没有id,没有与session关联
-
持久化状态
有id,与session有关联
-
游离|托管状态
有id,没有与session关联
public class Demo { @Test //查看三种状态 public void fun1(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer c = new Customer();//没有ID,没有与session绑定==>瞬时状态 c.setCust_name("黑狼");//瞬时状态 session.save(c);//持久化状态,有id,有关联 tx.commit(); session.close();//游离状态|托管状态,有id,没有关联 } @Test //三种状态的特点 //save方法: 其实不能理解为保存,理解成瞬时状态幻化成持久状态 //主键自增:执行save方法时,为了将对象转换为持久化状态,必须生成id值,所以需要执行insert语句 //increment: 执行save方法,为了生成id,会执行查询id最大值得sql语句 public void fun2(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer c = new Customer();//没有ID,没有与session绑定==>瞬时状态 c.setCust_name("黑狼");//瞬时状态 session.save(c);//持久化状态,有id,有关联 tx.commit(); session.close();//游离状态|托管状态,有id,没有关联 } @Test //三种状态特点 //持久化状态特点: 持久化状态对象的任何变化都会同步到数据库中 public void fun3(){ Session session = HibernateUtils.openSession(); Transaction tx = session.beginTransaction(); Customer c = session.get(Customer.class, 1l); c.setCust_name("清子公司"); tx.commit(); session.close();//游离状态|托管状态,有id,没有关联 } }
-