其中所说的表指的是被hibernate所管理的表,添加一个domain或者属性hibernate会创建对应的表或者更新所在列,但是删除属性或者domain后hibernate不做处理。
三、OIDOID在Hibernate中唯一标识了一个对象,在一级缓存中,Type+OID唯一标识了一级缓存中相同的数据,一般情况,在domain当中,需要用OID属性来重写equals和hashcode法方法,id元素都有一个generator子元素,规定了主键的生成策略.
<id column="uid"> <generator></generator> </id> 1.自然主键assigned,在保存之前,必须要手动设置值,assigned针对的是自然主键。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定。
2.代理主键主键的值是由数据库或者hibernate来自动生成的
uuid 使用uuid作为主键值 ,要求类型必须是String的
increment:由hibernate来生成主键,先查询当前表的id最大值,然后给最大值加上1作为当前主键值,要求主键类型可以递增,并且不能在集群(多个hibernate实例使用同一个数据库)的情况下使用。
identity:数据库来生成id,mysql数据库auto_increment ,oracle不支持id生成策略所有不能使用
native: 使用数据库本地生成策略
主键生成策略详细:https://www.cnblogs.com/hoobey/p/5508992.html
四、Session中的方法 1.常用方法 Transaction beginTransaction():设置事务的活动状态. Transaction getTransaction():获取一个事务 Serializable save(Object o):保存一个对象 void update(Object o):修改一个对象 void delete(Object o):删除一个对象 Object get(Class type,Serializable id):根据主键查询指定类型的对象 Query createQuery(String hql):根据hql创建一个查询对象 void close():关闭Session void clear():清除一级缓存所有对象 void evict(Object o):清除一级缓存中制定的对象 2.save方法和persist方法persist和方法save方法都表示保存一个对象,但是persist方法必须运行在事务空间内,save方法在没有事务的环境也会发送sql,persist方法则不会发送 sql
3.get和load方法发送SQL的时机不同. get:立刻发送.load:使用该对象的非OID属性,才发送.(延迟加载)
返回结果是否为null. get:如果OID存在,则返回不为null,否则返回null. load:因为返回的是一个代理对象,永远不为null. 如果OID不存在会报错
是否创建代理对象: get:不会 load:创建
@Before public void testSave() { User user = new User(); Session session = HibernateUtil.getSession(); session.beginTransaction();//设置事务活动状态 /** * 在没有事务的环境下save还会发送sql,persist不会发送sql 保存对象一定要在事务的环境下才可以成功 * persist是为了时下JPA规范 */ session.save(user); //session.persist(user); session.getTransaction().commit();//提交事务 session.close(); } @Test public void testGet() { Session session = HibernateUtil.getSession(); System.out.println("----"); /** * get方法:数据库存在返回的user不为null,反之返回 null。并且会立刻发出sql */ //User user = (User) session.get(User.class, 2L); /** * load方法: 返回的user对象始终不为null,并且 在使用费OID属性的时候才会发出sql语句 * 创建了代理对象 User_$$_jvst42_0 .所以始终返回的不是null */ User user = (User) session.load(User.class, 1L); System.out.println("----"); if(user == null) { System.out.println("user为null"); }else { System.out.println("user不为null"); } System.out.println(user.getClass());//class hello.domain.User_$$_jvst42_0 --load user.getName();//load方法在使用非OID属性的时候才发出sql session.close(); } 五、持久化对象的生命周期和对象的状态 1.临时状态特点:没有OID,没有被session管理
对象刚刚被new出来,没有OID也没有在一级缓存中(没有被session所管理)
处于删除状态的对象,在提交事务之后,对象也处于临时状态
2.删除状态特点: 有OID,也被session所管理,但是最终会被删除。删除状态的对象必须等到session刷新flush,事务提交的时候才真正被删除。