Hibernate学习(二)

一、Hibernate持久化状态

瞬时态

瞬时态也称为临时态或者自由态,瞬时态的实例是由new命令创建、开辟内存空间的对象,不存在持久化OID(相当于键),尚未与Hibernate Session建立关联,在数据中也没有任何记录,失去引用后被JVM回收。瞬时态对象在内存中是孤立存在的,与数据库中的数据无任何关联,仅仅是信息的载体。

持久态

持久态的对象存在持久化的标识OID,加入Session缓存中,并且相关联的Session没有关闭,在数据库中有相应的记录,每条记录只对应唯一的持久化对象,需要注意的是,持久态对象是在事物还未提交前变为持久态的。

托管态

托管态也称为离线态或者游离态,当某个持久化状态的实例与Session的关联被关闭时就变成了托管态。托管态对象存在持久化标识OID,并且仍然与数据库中的数据存在关联,只是失去了与当前Session的关联,托管对象发生改变时Hibernate不能检测到。

三种状态的对比:

是否能在数据库存在记录 是否存在OID 是否由Session管理 是否能发sql语句
瞬时态
持久态
托管态

三种状态的转化图:

CsQum6.png

二、Hibernate通过实体类建立数据库表

Hibernate通过实体类建立数据库表只需在Hibernate.cfg.xml文件中配置

<property name="hbm2ddl.auto">update</property>

这个配置还有其他参数:

  • create:启动hibernate时,自动删除原来的表,新建所有的表,所以每次启动后的以前数据都会丢失。
  • create-drop:启动hibernate时,自动创建表,程序关闭时,自动把相应的表都删除。所以程序结束时,表和数据也不会再存在

三、遇到的问题

当使用上面的配置来创建数据库表会显示创建表的sql语句有问题。这时需要修改Hibernate.cfg.xml的配置。将

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

替换为

<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

替换之后建表成功。

posted @ 2018-05-15 15:05  RicardoWX  阅读(143)  评论(0编辑  收藏  举报