www.springside.org.cn,解壓後運行 bin/quickstart.bat 啟動三大示例項目Maven/bin 加入 PATH,刪除 ~/.m2 加速首次構建bin/new-project.bat,輸入 groupId=youxia.personal、artifactId=MultiDatasourceExample、package=personal.youxiaRun On Server 一鍵部署,項目零紅叉可直接運行注意:默認使用 Derby,需先運行 start-db.bat 再運行 init-db.jar 初始化數據。
修改 schema.sql:DROP TABLE IF EXISTS、AUTO_INCREMENT 替換 GENERATED ALWAYS AS IDENTITY。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="${jdbc.url}"/> ...
</bean>
<bean id="sessionFactory" class="...AnnotationSessionFactoryBean">
<property name="hibernateProperties">
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> ...
</property>
</bean>
下載 mysql-connector-java-5.x.jar 到 WEB-INF/lib。
創建 src/main/java-self,四層包結構:entity、dao、service、web,避開框架自帶包干擾。
@Entity @Table(name="articles")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Article extends IdEntity {
private String subject, content;
private Set<Comment> comments = new LinkedHashSet<Comment>();
@OneToMany(cascade=CascadeType.ALL) @JoinColumn(name="article_id")
@Fetch(FetchMode.SUBSELECT) @OrderBy("id")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public Set<Comment> getComments() { return comments; }
// getter/setter...
}
@Entity @Table(name="comments")
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
public class Comment extends IdEntity {
private String content;
private Long articleId;
@Column(name="article_id")
public Long getArticleId() { return articleId; }
// getter/setter...
}
public class ArticleDao extends HibernateDao<Article, Long> { }
public class CommentDao extends HibernateDao<Comment, Long> { }
@Service
public class ArticleManager extends EntityManager<Article, Long> {
@Autowired private ArticleDao articleDao;
@Override protected HibernateDao<Article, Long> getEntityDao() { return articleDao; }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext*.xml" })
public class DataAccessTest extends SpringTxTestCase {
@Autowired private ArticleManager articleManager;
@Autowired private CommentManager commentManager;
@Test public void addArticle() {
Article a = new Article(); a.setSubject("test"); a.setContent("test");
articleManager.save(a);
Comment c = new Comment(); c.setArticleId(a.getId());
commentManager.save(c);
}
}
@Service,DAO 需 @Repositorypersonal.youxia.entity.entities(匹配 packagesToScan)第七步:編寫 Action 與 JSP 實現 Web 交互(見中篇)。