目录 start
目录 end
|2018-04-18| 码云 | CSDN | OSChina
如果后续需要添加表的话,就这个顺序
Hibernate 3.6
作为默认的主配置文件
默认是Log4j, 在etc下复制log4j.properties到src下,就可以了,本人ssh下复制log4j.xml就可以了
重量级容器:消耗大量资源,不能有太多实例,二级缓存 通常将该工厂类是单例模式,一个工厂类实例表示一个数据库 所以Hibernate一般是不能跨数据库来做事务操作。但是EJB和JPA可以实现
这个配置选项: hibernate.hbm2ddl.auto create-drop 在一个数据库中创建,然后使用完关闭实例时就删除所有建立的表 hibernate.hbm2ddl.auto create 清除数据库的表及数据,重新创建表 hibernate.hbm2ddl.auto update 更改配置文件,能够在数据库进行操作(更新,建立) hibernate.hbm2ddl.auto validate
轻量级的容器,一级缓存 是非线程安全的对象
在Hibernate中唯一标识对象的属性,每个实体都是必须要有OID的
id = hi+lo (高位和低位进行组合) sessionFactory实例化,高位就会加一,生成算法是:hi*(max lo +1)+lo;
<generator class="hilo" >
<param name="table">stu_hilo</param>
<!-- 放高值的表名 最好是一个对象对应于一个高低值的表避免了并发-->
<param name="cloumn">next_hi</param>
<!-- 高的值放在表的哪个字段 -->
<param name="max_lo">100</ param>
<!-- 每个轮回值的上限是多少 虚拟机启动频繁就设小一些,避免编码的浪费-->
</generator>
<set name="Nos" table="表">
<key column="外码"></key><!-- 外码 是必须的 -->
<element column="号码" type="string"/>
</set>
<list>
<key></key>
<index></index>
<element></element>
</list>
<property name="" formula="(select sum() from 选修表 as u where u.id=id)"></property>
<set name="" [cascade=""]>
<key column="这是外键"></key>
<one-to-many class="多方的类"></one-to-many>
</set>
<many-to-one name="" class="一方的类" column="外键,key要一致" />
<set name="类中属性名(集合)" inverse="true">
<key>< column name="数据库列名"/></key>
<one-to-many class="多方类路径"/>
</set>
2.在一的一方,修改POJO持久类文件,添加一个hashset,用来存储多方,添加setget方法,名字就是配置文件里添加的那个名字 注意修改构造器
3.在多的一方,修改xml文件,置换掉那个外键,换成many-to-one标签,里面写上外键的列 <many-to-one name="类中属性名(对象)" class="一方的类路径" column="数据库中列名"></many-to-one>
4.在多的一方,修改POJO持久类文件,添加一个一方的对象添加setget方法,名字就是配置文件里添加的那个名字 注意修改构造器
<set name="students" table="student_course">
<key column="cid"></key>
<many-to-many class="Student" column="stu_id"></many-to-many>
</set>
<set name="courses" table="student_course">
<key column="stu_id"></key>
<many-to-many class="Course" column="cid"></many-to-many>
</set>
<many-to-one name=""class="映射的类" column="数据库字段" unique="true"></many-to-one>
<many-to-one name="" class="乙方类"column="数据库字段" unique="true"></many-to-one>
<one-to-one name="" class="甲方类" property-ref="甲方配置的标签的name"></one-to-one>
注意:既然实现了这样的操作,那就说明了在实例化成绩的时候,不需要指定课程的值,那就需要添加一个构造器
两种方式,一般采用前者
<!-- 将子类插入到父类的配置文件 需要使用key来关联的-->
<joined-subclass name="cn.hibernate.extend.Student" table="extend_student">
<key column="id"></key>
<property name="sru_id" type="long"></property>
</joined-subclass>
<!--
union是相当于将父类的所有属性复制到子类里,是共享父类的OID,
所以父类的OID是不能和子类的OID重复的
不然 查询的时候就会报错,
所以就需要改父类的主键生成策略是高低值(或者是手动set),可以手动配置高低值的表的生成
-->
<union-subclass name="cn.hibernate.extend.Student" table="union_student">
<property name="sru_id" type="long"></property>
</union-subclass>
原因:1 可能真的没写get方法,或者get方法不合规范 setget方法中不允许两个连续大写字母 2 *.hmb.xml文件中的属性名和pojo持久类中属性名不一致(一定不能在表名中添加下划线) 3 方法名写错(基本不可能,都是自动生成的)
当使用了没有 主键的表,使用Myeclipse自动创建配置文件,使用自己的Table2Class来生成POJO持久类, 就要继承对应的自动创建的抽象类,因为没有主键的表默认是将所有列看成一个主键,并且还会有添加一个id属性, 这样也说明还有一点就是,这种表的字段不能有叫做id的列
是不是可以不用手动去使用那个类,好像这里自动生成的一切都有,
自动生成会生成: 对应POJO的抽象类,hbm配置文件,以及默认的几个类,HibernateSessionFactory,IBaseHibernateDao, 对应的Dao(添加的时候默认是没有使用事务,所以需要手动修改),添加,删除,都是依据主键的, 至少要初始化主键,当然还得满足数据库的要求
主要是对象内存和Session中的状态区别,而不是Session和数据库
临时态
:刚实例化对象。对象在数据库中不存在,Session中也不存在游离态
:刚实例化的对象,但是该对象手动指定了OID并且OID在数据库中已经存在,并且是没有绑定Session的(特殊的临时态)
持久态
:该对象在数据库中存在,该对象绑定在Session(一级缓存)中删除态
:session.delete(对象),删除后对象从数据库和Session中都移除了,但是OID还在内存中。
一个对象(内存)不能存在于多个Session中,一个存,一个改的情况是会错误的
但是数据库中同一条记录可以实例化为多个对象(内存),那么这些对象(内存)放在不同的Session中是可以的
get:
load:
懒加载如果Session关闭了或者是对象游离态。就会有懒加载初始化的异常