1.若是想要打印详细的建表等信息,则首先导入slf4j-api.1.5.8.jar log4j-1.2.15.jar slf4j-log4j12-1.5.8.jar三个jar包,使slf4j用log4j的接口实现。
然后在src目录下,创建log4j.properties 复制下面代码即可。
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=warn, stdout
#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug
### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL
#log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug
### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug
### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug
### log cache activity ###
#log4j.logger.org.hibernate.cache=debug
### log transaction activity
#log4j.logger.org.hibernate.transaction=debug
### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug
### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
2.有时候用Junit测试,配置文件出了错误,异常却被Junit吞掉了。
应该在JUnit中把这句话用try catch包含。
SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();
或者重新写个main方法,调用初始化函数。
3.为了使打印出来更好看,可以在hibernate.cfg.xml文件中加上一句配置属性
<property name="format_sql">true</property>
4.用Annotation时,若是表明与类名不同,则在类上加 @Table
比如
@Entity @Table(name="tbl_version") public class Version { ... }将类Version,映射到表“tbl_version".
若是数据库中的列与类的属性不同,则在get属性上加@Column属性。
比如
@Column(updatable = false, name = "flight_name", nullable = false, length=50) public String getName() { ... }
在上面这个例子中,name属性映射到flight_name列. 该字段不允许为空,长度为50,并且是不可更新的(也就是属性值是不变的).
5.clear
无论何时,当你给save()、update()或 saveOrUpdate()方法传递一个对象时,或使用load()、 get()、list()、iterate() 或scroll()方法获得一个对象时, 该对象都将被加入到Session的内部缓存中。
当随后flush()方法被调用时,对象的状态会和数据库取得同步。 如果你不希望此同步操作发生,或者你正处理大量对象、需要对有效管理内存时,你可以调用evict()
方法,从一级缓存中去掉这些对象及其集合。
如若要把所有的对象从session缓存中彻底清除,则需要调用Session.clear()
。
6.flush
Session刚创建时,可以设置 flushmode ,比如:sess.setFlushMode(FlushMode.NEVER);
常用的有never,always,前者从不更新,用于只读性操作, 不需要更新数据的情况,可以用来性能优化,后者进行任何操作都进行更新。
7.SchemaExport可以使打印出来的数据库语言更好看。
@Test
public void TestSchema()
{
AnnotationConfiguration cfg=new AnnotationConfiguration().configure();
new SchemaExport(cfg).create(false, true);
}
8.批量更新数据需要注意的问题
批量更新,数据若是很多,一下子把所有对象加载到缓存中,并不可取,应该每处理一些数据就清理Session缓存,
if(++count%20==0)
{
session.flush();
session.clear();
}
9.悲观锁与乐观锁
Monkey monkey=(Monkey)session.get(Monkey.class,new Long(1),LockMode.Update);
如果数据库支持悲观锁,就执行select...for update语句,会对对应的数据加上悲观锁。若数据库系统不支持悲观锁,就执行普通的select语句。
session.lock(monkey,LockMode.READ);
立即进行版本检查,若是版本与MONKEYS表中记录的版本不一致,说明该表记录已被修改,会抛出异常。