本文涉及到一个简单的网络应用程序,这个程序使用了常规sql及Postgresql的hstore类型的键值对。思想是将Nosql混合进sql中,而这个方法的好处则是可以在同一个数据存储中同时储存sql和Nosql类型数据。
在这个例子中将覆盖Java、Spring和Hibernate服务器技术,当然也可以通过Rails、Django及一些其他技术来实现。为了向Hibernate中添加对hstore的支持,更是特意的查询了“通过Hibernate向单一数据库行中储存Postgresqlhstore类型键/值对”这篇文章。虽然编码内容不会在这里详谈,但是你可以通过GitHub repo for my demoproject得到你想要的一切。
演示应用程序使用Maven来定义依赖性。Jetty的嵌入则是通过一个简单的oleJava用用程序开始。Spring则是通过Java Config中的main部分、web部分及database部分来配置。
客户端技术将会用到jQuery和Bootstrap,而客户端和服务器将会通过RESTfulJSON服务进行严格分隔。整个客户端部分都会放在一个简单的oleHTML文件中。客户端与JSON之间将通过jQuery/Ajax实现通信,这点则是在Spring MVCController中得以声明。
言归正传,回到在sql中实现Nosql上来。虽然该应用程序存储的“Contacts”只有一个name属性,但是不妨碍它拥有“ContactsMethods”(比如,电话号码和电子邮箱地址)。“ContactMethods”是个非常好的无模式键值对列因为它避免了繁琐的替代选择:将这些信息放进一个单独的表或者尝试去建立一个包含所有可能存在的“ContactMethods”类。来让我们看一下简单的Contact类:
package com.jamesward.model;
importnet.backtothefront.HstoreUserType;
import org.hibernate.annotations.Type;
importorg.hibernate.annotations.TypeDef;
import javax.persistence.Column;
import javax.persistence.Entity;
importjavax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.util.HashMap;
import java.util.Map;
@Entity
@TypeDef(name = "hstore",typeClass =HstoreUserType.class)
public class Contact {
}
如果你熟知Hibernate/JPA的话,那么以上这些对于你来说都会非常的熟悉。而吸引你的陌生之处在于contactMethods对象的修饰—Map,并且还使用了Postgresql的hostore数据类型。为了正常运行,hostore数据的类型必须被定义以及columnDefinition集。这不得不再次感谢JakubGluszecki对HstoreHelper和HostoreUserTyper的整合,否则的话这一切都无法实现。
package com.jamesward.service;
import com.jamesward.model.Contact;
import org.springframework.stereotype.Service;
importorg.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaQuery;
import java.util.List;
@Service
@Transactional
public class ContactServiceImpl implements ContactService {
}
在你了解它的工作机制后,我们要开始尝试在Heroku上面的演示了。
$ git clonehttps://github.com/jamesward/spring_hibernate_hstore_demo.git
$ cd spring_hibernate_hstore_demo
在本地运行需要做的工作:
$ psql -U username -W -h localhostdatabase
2. 启用hstore:
=> create extension hstore;
=> \q
3. 建立应用程序(这部依赖Maven的安装):
$ mvn package
4. 设置DATABASE_URL环境变量指向你的Postgresql服务器:
$ exportDATABASE_URL=postgres://username:password@localhost/databasename
5. 运行应用程序:
$ java -cp target/classes:target/dependency/*com.jamesward.Webapp
6. 尝试一下
完美?!现在再试一下通过Heroku在云上运行。你需要完成以下几个步骤:
1. 安装Hero Toolbelt
2. 登陆Heroku:
$ heroku login
3. 建立一个新的应用程序:
$ heroku create
4. 添加Heroku Postgres:
$ heroku addons:addheroku-postgresql:dev
$ heroku pg:promoteYOUR_HEROKU_POSTGREsql_COLOR_URL
$ heroku pg:psql
=> create extension hstore;
=> \q
8. 部署应用程序:
$ git push heroku master
9. 在云端查看应用程序:
$ heroku open