<!-- 使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL to stdout -->
<!-- 是否打印到控制台 -->
<property name="hibernate.show_sql">true</property>
<!-- 使SQL语句格式化
<property name="format_sql">true</property>
生成表时的方式
<property name="hbm2ddl.auto">update</property>
设置hibernate的事物隔离级别
<property name="connection.isolation">2</property>
-->
session的 get和load方法的区别:1.执行get方法:会立即加载对象。
执行load方法:若不使用该对象,则不会立即执行查询操作。而返回一个代理对象
get是立即检索,load是延迟检索
2.若数据表中没有对应的记录,
get返回null;load 若不使用该对象的任何属性没问题;若需要初始化了,则抛出异常
3.在需要初始化代理对象之前已经关闭了Session
load方法可能会抛出LazyInitializationException异常:懒加载
update方法:1.若更新一个持久化对象,不需要显式的调用update方法。因为在调用Transaction
的commit()方法时,会限制session的flush方法。
2.更新一个游离对象,需要显式的调用session的update方法。可以把一个游离对象变为持久化对象
需要注意的是:
1.无论要更新的游离对象和数据表的记录是否一致,都会发送UPDATE语句。
如何能让UPDATE方法不在盲目的去发update语句呢?在.hbm.xml文件的class节点设置
select-before-update=true(默认为false)。但通常不需要设置该属性。
2.若数据表中没有对应的记录,但还是调用了update方法,会抛出异常。
3.当update()方法关联一个游离对象时,如果在session的缓存中已经存在相同的OID的持久化对象,会抛出异常。
因为在session缓存中不能有两个OID相同的对象。
SaveorUpdate:
1.若OID不为null,但数据表中还没有和其对应的记录,会抛出一个异常
2.OID值等于id的unsaved-value属性值的对象,也被认为是一个游离对象
delete:
执行删除操作。只要OID和数据表中一条记录对应,就会准备执行delete操作
若OID在数据表中没有对应的记录,则抛出异常
可以通过设置hibernate配置文件hibernate.use_identifier_rollback为true,
使删除对象后,把其OID置为null
evict:从session缓存中把指定的持久化对象移除
存放图片到数据库
InputStream stream=new FileInputStream("文件名.jpg");
Bolb image =Hibernate.getLobCreator(session).createBlob(stream,stream.available());
news.setImage(image);
session.save(news);
取图片
News news=(News)session.get(News.class,1);
Blob image=news.getImage();
InputStream in =image.getBinaryStream();
System.out.println(in.available());//图片大小
set:中的三个属性:inverse:指定由哪一方来维护关联关系。通常设置为true,以指定由多的一端来维护关联关系
cascade:设定级联操作,开发时不建议设定该属性。建议使用手动的方式来处理
order-by:在查询时对集合中的元素进行排序,order-by中使用的是表的字段名,而不是持久化类的属性名。