4. in SpringSide3
4.1 Showcase中使用的Spring功能索引
? ? ? ? ? ?
JMX:JMX的Server端封装 JMS:JMS Template封装 Email:EMail客户端封装
Schedule:Quartz的封装,ScheduleExecutor的封装 Ehcache:Ehcache Server封装 Jdbc:Spring JdbcTemplate
4.2 SpringContextHolder
在Spring ApplicationContext启动时,先把Context放入个该类的静态变量,当模块的代码无法通过正常渠道获得Spring Context及其中的Bean时,可直接从该静态变量中获取。
4.3 AOP Aspect的写法
最新的写法,一切都写在java文件里,只要在applicationContext.xml里面定义一把scan就可以了。
?
Database: ORM-Hibernate, Jdbc-Spring JdbcTemplate, 数据库 - H2、MySQL、Oracle, 数据库连接池-DBCP
1. 资料
数据库访问资料(江南白衣博物馆) ? JPA与Hibernate笔记(江南白衣博物馆) ? 2. 选型
因为最近一年来,JPA与EJB3的应用都没有想象中的多,在国内尤其突出。所以仍然使用纯Hibernate API+JPA1.0 annotation. 支持JPA2.0的Hibernate 3.5刚出来,要再继续观察。
3. in SpringSide 3
3.1 Entity类
1.Mini-Web中的User类是entity类的典型,集中演示了缓存,默认命名策略,多对多关系的定义和fetch策略,级联操作策略,子集合的 排序和缓存、非持久化属性, 见JPA与Hibernate笔记
2.为了统一ID的列名与生成算法,编写了IdEntity基类,演示了自增序列,数据库Sequence(Oracle), UUID(多数据库)的情形。(如果要在Oracle中为每个Entity对应不同Sequence时- 重载getId()函数)。
3.2 更换MySQL或Oralce等数据库
详见数据库说明。
1. H2
1.1 选型
H2嵌入式模式是功能测试的首选。测试要求数据库运行要非常快速,而且为免测试间数据的耦合,要能在每个测试间很快速的重建数据,H2刚好满足这个需求。
H2的主要对手是Derby,对比显示H2比Derby更快,而且有着非常好用的Web管理界面(在Web界面里写SQL时居然有表名列名的动态提示....)
1.2 in Springside 3
在/tools/h2目录里带了启动H2的命令(借助于maven管理的Jar包)。
另外,H2完全兼容hsqldb的语法,一般依赖数据库的开源项目都附带有hsqldb语法的初始化脚本。
SpringSide3中在使用嵌入式H2提供快速功能测试。url为jdbc:h2:mem:mini-service;DB_CLOSE_DELAY=-1 同时运行期的数据库也使用了H2的Server模式,url为jdbc:h2:tcp://localhost/~/mini-service。
2. MySQL 与 Oracle
开发实际项目时,需要将H2更换为实际数据库,Hibernate支持大部分的数据库,其中Java程序员选用MySQL和Oracle的最多。 更换MySQL与Oracle 主要修改几个地方,SpringSide已在两个mini-example中带了示范配置,取消相应的注释符号即可。
1.pom.xml
注意因为版权问题,Oracle的Driver不在maven官网的仓库上,需要自行发布到团队的私服或拷贝到本机的maven仓库目录。
2.src/main/resource/applicationt.properties
用于连接池与hibernate的配置。
3. bin/build.xml
用于导出导入数据到数据库。
4. bin/hibernate/hibernate.cfg.xml
如果需要用hibernate-tools生成代码则修改此文件,否则可忽略。
5.修改entity的ID生成策略。
注意Oracle中一般会为每个主要的表创建一个Sequence,所以继承于IdEntity的子类需要重载getId()方法指定Sequence名。 当然也可以只修改IdEntity基类,所有entity共用一个sequence。
3.3 Event机制
在Showcase中的AuditListener, 演示了利用Event机制,在save与update时自动为实体加入审计信息(创建人与创建时间,最后修改人与修改时间)
3.4 @Version字段
在Showcase中演示,@Version字段用在诸如两个管理员在差不多时间里打开了同一对象的修改页面可能引发的冲突,Struts2的 Prepareable机制对其使用有些许影响,需进行编码检查, 详见UserAction.
3.5 Clob字段
在Showcase中演示,Clob字段用String表示即可,但为了达到Lazy Load的效果,必需进行byte code enhancement,见showcase中bin/hibernate/bytecode-instrument中执行的Ant指令。 @Lob
@Basic(fetch = FetchType.LAZY) public String getContent() { return content; }
3.6 继承
在Showcase中演示,为性能考虑,一般采用同表继承,另外,在基类放一个@ForceDiscriminator有时候很有用。 @Table(name = \
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) @ForceDiscriminator
public abstract class Post @Entity @DiscriminatorValue(\