1.实体类必须有一个无参的构造函数,因为反射会用到。
2.实体类不能加final,因为加上final它便不能被继承。影响懒加载功能。
3.如果JAVA对象中的某个属性不需要存储在数据库中,那么就不需要配置在映射文件里面。
4.private 构造函数(){
}
这样其他人就没办法new这个对象了。
5.static游离块。只有当虚拟机加载这个类 (注意不是对象)的时候,才会执行一次里面的代码。
6.load方法,只有在真正用到对象的时候才会去数据库查询,当session关闭时,用到这个对象会报错。
Session session = null;
session = HibernateSessionFactory.getSession();
//User u1 = (User)session.get(User.class,1);
User u = (User)session.load(User.class,1);
不会报错
//System.out.println(u.getUsername());
session.close();
会报错
System.out.println(u.getUsername());
load会直接new一个对象,哪怕数据库中不存在。
7.瞬时,持久,脱管
User u2 = new User();
u2.setUsername("a");
瞬时对象,自己new的,数据库中没有记录与之对应。
持久:数据库中有对象与之对应,与session有关联,关联session没有关闭。当持久化对象变化时,事务提交时,hibernate能检测到。
脱管(游离):数据库中有数据与之对应,但是没有session与之关联。被人遗弃的有名分的孩子。
Session session = null;
session = HibernateSessionFactory.getSession();
Transaction t = session.getTransaction();
t.begin();
User u = new User();
u.setPassword("abc");
u.setUsername("jinlong");
session.save(u);
//这里就会执行添加的sql语句,但是如果没有t.commit的话,会回滚,刚添加的数据会被删除,数据库里的主键ID会+1.证明那条数据被删除。
u.setUsername("changename");
//因为修改了名字,因为他是持久化对象,所以会执行一条update更新语句。
t.commit();
session.close();
8.什么时候使用session.update();?
当对象处于脱管对象的时候,应该使用session.update()语句。
如下:
Session session = null;
session = HibernateSessionFactory.getSession();
User u = (User)session.get(User.class, 1);
session.close();
Session session1 = null;
session1 = HibernateSessionFactory.getSession();
Transaction t = session1.getTransaction();
u.setUsername("icanplay");
t.begin();
session1.update(u);
t.commit();
session1.close();
9.什么时候用saveorupdate ?当你不知道这个对象是游离还是脱管对象的时候,用它吧。
Session session = null;
session = HibernateSessionFactory.getSession();
User u = (User)session.get(User.class, 1);
session.close();
Session session1 = null;
session1 = HibernateSessionFactory.getSession();
Transaction t = session1.getTransaction();
u.setUsername("icanplayit!");
t.begin();
User u1 = new User();
u1.setPassword("aaa");
u1.setUsername("whatcanido");
session1.saveOrUpdate(u1);
//update游离对象,会报错
//session1.update(u1);
t.commit();
session1.close();
saveorupdate之后,你的对象会变成持久的,merge之后,你的对象还是脱管的。
merge :
Session session = null;
session = HibernateSessionFactory.getSession();
User u = (User)session.get(User.class, 1);
session.close();
Session session1 = null;
session1 = HibernateSessionFactory.getSession();
Transaction t = session1.getTransaction();
u.setUsername("icanplayit!");
t.begin();
User u1 = new User();
u1.setPassword("aaa");
u1.setUsername("whatcanido");
//会执行一条添加,一条更新
session1.saveOrUpdate(u1);
//因为merge之后是脱管的,所以只执行一条添加
//session1.merge(u1);
//update游离对象,会报错
//session1.update(u1);
//这句便可以测出是脱管还是持久对象
u1.setUsername("完蛋了");
t.commit();
session1.close();
10.unsaved-value="-1"
这个属性用来判断一个对象是游离还是脱管。