hibernate3.3.2学习笔记---重要细节

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表中记录的版本不一致,说明该表记录已被修改,会抛出异常。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值