调查管理系统(2)---数据库

来源:互联网 发布:淘宝直通车软件 编辑:程序博客网 时间:2024/04/29 19:58

事务属性:
1.传播行为.
2.隔离级别
1.读未提交
2.读已提交
3.可以重复读
4.串行化
3.只读:优化
4.超时,释放资源
5.回滚规则:异常抛出,任然可以提交事务.

 

[user ] 1                           n [ survery ]  1                                      n[page]1                                    n[ question]

              <--------------                                 -------------------------                         ----------------

综合        单向关联                                            双向                                                     双向

user <---------------------survery             

用户不关联到调查的原因:

1.user ---------------------->session

用户(关联太多信息)存储在session(服务器)中性能太低 ,大并发访问会性能下降。   

2.用户到调查存在很少的访问关系,只有“我的调查”需要

                         

[表结构]
users表
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| email    | varchar(50) | YES  |     | NULL    |                |
| password | varchar(50) | YES  |     | NULL    |                |
| nickname | varchar(50) | YES  |     | NULL    |                |
| regdate  | datetime    | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+


surveys表
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| title         | varchar(200) | YES  |     | NULL    |                |
| pretext       | varchar(50)  | YES  |     | NULL    |                |
| nexttext      | varchar(50)  | YES  |     | NULL    |                |
| donetext      | varchar(50)  | YES  |     | NULL    |                |
| exittext      | varchar(50)  | YES  |     | NULL    |                |
| createtime    | datetime     | YES  |     | NULL    |                |
| userid        | int(11)      | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+


pages表
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| title       | varchar(200) | YES  |     | NULL    |                |
| description | varchar(500) | YES  |     | NULL    |                |
| surveyid    | int(11)      | YES  | MUL | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+


questions表
+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
| questiontype        | int(11)      | YES  |     | NULL    |                |
| title               | varchar(200) | YES  |     | NULL    |                |
| options             | varchar(200) | YES  |     | NULL    |                |
| other               | bit(1)       | YES  |     | NULL    |                |
| otherstyle          | int(11)      | YES  |     | NULL    |                |
| otherselectoptions  | varchar(200) | YES  |     | NULL    |                |
| matrixrowtitles     | varchar(200) | YES  |     | NULL    |                |
| matrixcoltitles     | varchar(200) | YES  |     | NULL    |                |
| matrixselectoptions | varchar(200) | YES  |     | NULL    |                |
| pageid              | int(11)      | YES  | MUL | NULL    |                |
+---------------------+--------------+------+-----+---------+----------------+


[映射文件]
User.hbm.xml
<hibernate-mapping>
<class name="cn.itcast.surveypark.domain.User" table="users">
<id name="id" column="id" type="integer">
<generator class="identity" />
</id>
<property name="email" column="email" type="string" length="50" />
<property name="password" column="password" type="string" length="50" />
<property name="nickName" column="nickname" type="string" length="50" />
<property name="regDate" column="regdate" type="timestamp" update="false"/>
</class>
</hibernate-mapping>


Survey.hbm.xml
<hibernate-mapping package="cn.itcast.surveypark.domain">
<class name="Survey" table="surveys">
<id name="id" column="id" type="integer">
<generator class="identity" />
</id>
<property name="title" column="title" type="string" length="200" />
<property name="preText" column="pretext" type="string" length="50" />
<property name="nextText" column="nexttext" type="string" length="50" />
<property name="exitText" column="exittext" type="string" length="50"/>
<property name="doneText" column="donetext" type="string" length="50"/>
<property name="createTime" column="createtime" type="timestamp" update="false" />
<!-- 映射从Survey到user之间多对一关联关系 -->
<many-to-one name="user" class="User" column="userid" />

<!-- 映射从Survey到Page之间一对多关联关系  -->
<set name="pages" inverse="true">
<key column="surveyid" />
<one-to-many class="Page"/>
</set>
</class>
</hibernate-mapping>
inverse="true"                    单向关联   在一对多的关系中,在一的方面设置inverse="true",可以由多的一方进行管理关系,有助于提高性能

Page.hbm.xml
<hibernate-mapping package="cn.itcast.surveypark.domain">
<class name="Page" table="pages">
<id name="id" column="id" type="integer">
<generator class="identity" />
</id>
<property name="title" column="title" type="string" length="200" />
<property name="description" column="description" type="string" length="200" />
<!-- 映射从Page到Survey之间多对一关联关系 -->
<many-to-one name="survey" class="Survey" column="surveyid" />
<!-- 映射从Page到Question之间一对多关联关系 -->
<set name="questions" inverse="true">
<key column="pageid" />
<one-to-many class="Question"/>
</set>
</class>
</hibernate-mapping>


Question.hbm.xml
<hibernate-mapping package="cn.itcast.surveypark.domain">
<class name="Question" table="questions">
<id name="id" column="id" type="integer">
<generator class="identity" />
</id>
<property name="questionType" column="questiontype" type="integer" />
<property name="title" column="title" type="string" length="200" />
<property name="options" column="options" type="string" length="200"/>
<property name="other" column="other" type="boolean"/>
<property name="otherStyle" column="otherstyle" type="integer" />
<property name="otherSelectOptions" column="otherselectoptions" type="string" length="200"/>
<property name="matrixRowTitles" column="matrixrowtitles" type="string" length="200"/>
<property name="matrixColTitles" column="matrixcoltitles" type="string" length="200"/>
<property name="matrixSelectOptions" column="matrixselectoptions" type="string" length="200"/>
<!-- 映射从Question到Page之间多对一关联关系 -->
<many-to-one name="page" class="Page" column="pageid" />
</class>
</hibernate-mapping> 

generator主键生成策略--------------属性

1、自动增长identity

适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识
使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)
数据库中的语法如下:
MySQL:create table t_user(id int auto_increment primary key, name varchar(20));
SQL Server:create table t_user(id int identity(1,1) primary key, name varchar(20));

<id name="id" column="id" type="long">
    <generator class="identity" />
</id>
2、sequence

DB2、Oracle均支持的序列,用于为long、short或int生成唯一标识
数据库中的语法如下:
Oracle:create sequence seq_name increment by 1 start with 1;
需要主键值时可以调用seq_name.nextval或者seq_name.curval得到,数据库会帮助我们维护这个sequence序列,保证每次取到的值唯一,如:
insert into tbl_name(id, name) values(seq_name.nextval, ‘Jimliu’);

<id name="id" column="id" type="long">
    <generator class="sequence">
       <param name="sequence">seq_name</param>
   </generator>
</id>
如果我们没有指定sequence参数,则Hibernate会访问一个默认的sequence,是hibernate_sequence,我们也需要在数据库中建立这个sequence
此外,sequence还可以有另外一个参数是paramters,可以查看Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator
调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:
<param name="sequence">NAME_SEQ</param>(Oracle中很常用)

3、hilo

使用一个高/低位算法生成的long、short或int类型的标识符,给定一个表和字段作为高位值的来源,默认的表是hibernate_unique_key,默认的字段是next_hi。它将id的产生源分成两部分,DB+内存,然后按照算法结合在一起产生id值,可以在很少的连接次数内产生多条记录,提高效率

MySQL:create table hi_value(next_hi integer not null);

insert into hi_value(next_hi) values(1);

<id name="id" column="id">
    <generator class="hilo">
       <param name="table">hi_value</param>
       <param name="column">next_hi</param>
       <param name="max_lo">100</param>
   </generator>
</id>
 
在hibernate持久化的时候,由hibernate负责生成低位值。hilo标识符生成器在生成标识符时需要从hi_value表中取出next_hi的当前值,然后修改该值,这个操作是在单独的事务中完成的。最大的低值在属性max_lo中配置,但在Hibernate内存中生成的低位值超过此值时,就有需要到数据库的hi_value表中再次读取高位值了
使用hilo生成策略,要在数据库中建立一张额外的表,默认表名为hibernate_unique_key,默认字段为integer类型,名称是next_hi(比较少用)
我们也可以自己设置自定义的表名和字段名
<id name="id" type="integer">
   <column name="id"/>
   <generator class="hilo">
      <param name="my_unique_key"/>
      <param column="next_hi"/>
   </generator>
</id>

4、native

会根据底层数据库的能力,从identity、sequence、hilo中选择一个,灵活性更强,但此时,如果选择sequence或者hilo,则所有的表的主键都会从Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高
     对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)

<id name="id" column="id">
    <generator class="native" />
</id>


increment:代理主键,适合于所有数据库,由hibernate维护主键自增,和底层数据库无关,但是不适合于2个或以上hibernate进程。

identity:代理主键,适合于Mysql或ms sql server等支持自增的dbms,主键值不由hibernate维护。

sequence:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。

native:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。(适合不同数据库的测试)

hilo:代理主键,hibernate把特定表的字段作为hign值,生成主键值

uuid.hex:代理主键,hibernate采用uuid 128位算法生成基于字符串的主键值

assign:适合于应用程序维护的自然主键。


0 0
原创粉丝点击