hibernate之初学篇笔记

来源:互联网 发布:unity3d debug输出 编辑:程序博客网 时间:2024/05/16 08:29

1,jnunit:
这个下载好之后,导入相应的包至项目,然后就可以在需要测试的class上右键,New,会有建立junit的提示,点击确定,填入相应的参数,然后就可以填写相应的测试代码了。有:test,before,after,beforeclass,afterclass,assertEaquls,assertThat,assertTrue等等。
对了,还有Run的容器的选择。


2,log4j:
log4j需要的东西不仅是他自己,还有slf4j这个接口的配置。需要他们建立一个链接。
这个property的解析文件,在hibernate中搜索就可以了,没有必要自己写啊。你也写不出来。

 

3,hibernate:

annotation:
ID生成策略:
@Id
@GeneratedValue(注意是javax.persistence包下的哦)——只有四种,默认auto,相当于nitave。如果是oracle就是hibernate_sequence。如果是mySQL就是auto_..。


Identity:
@GeneratedValue(strategy=GeneratrionType.IDENTITY)
这个在oracle中用不了,不支持。MySQL可以用。


Sequence:
@GeneratedValue(strategy=GeneratrionType.SEQUENCE)
这个是在hibernate框架之下实现的。
也可以指定生成的sequence的名称。

 

自动生成:
@ javax.persistence.TableGenerator{
 name = "Teacher_GEN";
 table = "GENERATION_TABLE";
 pkColumnName = "key";
 valueColumnName = "value";//以上定义的都是公用的
 pkColumnValue = "Teacher";//这个定义的是Teacher表的自动生成
 allocationSize = 1;//Teacher的自动开始值是1.
}

然后在Teacher类中要这么写:
@GeneratedValue(strategy=GeneratrionType.IDENTITY,generator = "Teacher_GEN")

 

 


联合主建:


在xml文件中这么实现:
比如学生的id和name联合作为主键,则将id和name新建一个studentPK.java(注意一定要实现serializable接口,知道为什么吗?看下面哈希码和equals),然后在student.java中private studentPK spk;然后制定主键的时候在Student.hbm.xml中要这么写:
<key-properyt name="id"></key-property>
<key-properyt name="name"></key-property>

hashcode和equals
先比较哈希码,哈希码相同的都放在一起了嘛,然后再比较wquals,相同的就是同一个对象了。


在annotation中这么实现:
三种方式:
1,@Embedable,@Id
把组件类注解为@Embedable,把组件的属性(也就是private studentPK pk这个上面)注解为@Id。


2,@EmbeddedId:
写在private studentPK spk  之上。这一句就行了。

3,@Idclass(value="TeacherPK.class")
也可以这么写,@Idclass(TeacherPK.class),需要在teacher.java的类中加上id和name。注意这个id和name是teacher.java的类中的,teacherPK.java中也有,会重复。然后@Id加在teacher.java中。

 


hibernate的核心接口:
session:这个就是那几个方法,没看,过了。。。
sessionFactory
opensession:每次都打开一个新的,用过之后必须关闭。
getCurrentSession:没有的时候才打开一个新的session。但是当用这个的时候,必须设置上下文。有两种jta(分布式,运行的时候需要application server的支持)和thread(从数据库界定事务,用的是数据库connection提供的事务)。在xml配置文件中。

 


调用各种方法的格式:session.xxXxx();

delete:
就是数据的删除了。。。。

load()方法:返回的是代理对象,等到用到对象的时候才执行SQL语句。
session.load(Teacher.class,1);第一个表示数据取出来之后当成什么类型的对象。第二个表示主键,把哪一条记录拿出来。也可以这么写:
Teacher t = (Teacher)session.load(Teacher.class,1)
System.out.println(t);

get()方法:立即执行这个语句
session.get(Teacher.class,1);

upDate()方法:
可以更新指定的字段,在xml文件中指定。
也可使用HQL(EJBQL)
upDate()是在commit()的时候才会执行。所以一般执行一次。当用flush()方法的时候就是强制缓存和数据库数据进行同步。

saveOrUpdate()方法:

无论是get()还是Iload()方法,都会先查找缓存,当缓存没有的时候才会执行sql语句查询数据库。而clear()的作用就是清楚缓存。

 

 


关联:

一对一:
单向:@OneToOne
双向:@OneToOne(mappedBy=""),凡是双向关联,必设mappedBy。
在xml中:<many-to-one name="person" class="Person" column="PERSON_ID" unique="true">

 

 

缓存:
一级缓存是session级别的,只能在session内部使用。
二级缓存是factorysession级别,所有session可以共用。
三级缓存是query缓存(查询缓存),当查询语句相同的时候可以使用。

load默认使用二级缓存,iterate默认使用二级缓存
list默认使用二级缓存加数据,但是查询的时候不使用。

 


事务并发处理:
事务的特性:ACID:原子性,一致性,独立性,持久性

脏读:读取的是别人尚未提交的数据
不可重复读:第一次和第二次读取的数据不一致,别的事务进行了提交产生而来影响
幻读:插入和更新的问题,


一般设置权限为:read-commited级别:hibernate.connection.islation=2;
那么需要解决的问题就是,不可重复读的问题none-repeadbaleread,有两种方式:悲观索和乐观所。悲观索,当自己处理的时候别人没有权限,悲观索是依赖于数据库本身的实现。

我们能设置的锁是:LockMode.UPGRADE;

 

1+N问题

list和iterate不同之处:list取出所有对象,iterate先取ID,等用的时候在根据ID取出对象。session中list第二次发出,仍会到数据库查询。iterate第二次,先到session缓存查找。

 

 

原创粉丝点击