Skip to content

Database

Calvin edited this page Nov 13, 2013 · 8 revisions

Overview

为简单起见,SpringSide的示例都使用H2作为演示用演示。 而实际的项目里,通常会使用H2作为开发期的,与容器外运行的功能测试的数据库,而使用Oracle或MySQL作为实际的生产数据库。 自从MySQL被Oracle收购,PostgreSQL也正式的选择进入很多项目的视线。

##数据库设计的一般性原则 1. 主键的列名统一为id。 1. 为方便数据操作及维护,不建立任何外键,用程序去保证关联关系。 1. 为表名添加前缀以便日后管理。比如有几十个表,将联系比较紧密的表,使用相同的前缀。 1. 表名全小写,因为MySQL在Linux下默认区分表名大小写。

H2

详见H2章节。

Mysql

只需要把quickstart的pom.xml中的关于jdbc driver的定义切换到mysql的版本,再切换application.properties中的jdbc参数即可。

如果在开发期需要也使用mysql,更改application.development.properties中的配置,并且修改pom.xml中refresh-db profile中sql脚本的目录。

如果在functional测试期间也需要使用mysql,更改application.functional.properties中的配置,并且修改applicatonContext.xml的functional profile中的sql脚本目录。

##Oracle Oracle的切换相对复杂一点,首先需要要去Oracle的网站: http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html 下载jdbc driver,然后放到自己本地或私服中的maven仓库,都这么多年过去了,Oracle还是这么反动的不肯把东西放到maven中央仓库。注意要下载支持jdk6的ojdbc6.jar,而不是N年前那种ojdbc14.jar。

同样切换pom.xml中的driver与appllication.properties中的jdbc参数

然后需要对Entity类进行改造。因为Oracle一般使用SEQUCENCE作为主键生成策略,而且每种Entity类使用一个独立的Sequence。此时统一的IdEntity基类就不再合适了,最好把它变为一个Id接口,然后在每个Entity中定义id及其Sequence。

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="UserSequence")
@SequenceGenerator(name = "UserSequence", sequenceName = "SEQ_USER", allocationSize=20)
private Long getId()

注意这里有个性能优化的地方,Hibernate一次问Oracle要了20个id自己慢慢用。相应的,sequence创建时需要修改increment by=20

 create sequence SEQ_USER start with 100 increment by 20;

此时,作为开发期的H2的schema脚本同样需要修改,不能再使用自生成的主键策略。幸运的是,H2同样支持Sequence。详见quickstart中的h2/schema-with-oracle.sql

如果要在开发期或functional测试期也使用Oracle,修改参见mysql部分。