使用PostgreSQL、Hibernate 构建 NoSQL

   众所周知,关系数据类型一直是SQL的诟病之一。随着数据的越加多样化,各种数据类型向关系数据类型的转换更是困扰着大多数的SQL数据库用户。然而SQL数据库能经久不衰,它的优点也是不容否定的。如果鱼与熊掌可以兼得— 在SQL数据库中实现NoSQL数据类型,那么一切岂不是变的非常美好?!

   话说世间万物有一得必有一失,而在0和1的世界里这点体现的是更加明显。无模式NoSQL存储在拥有了一些列的优点同时,付出的也不可谓不多。而NoSQL运动的主要优势莫过于赐予人们数据持久层的多样化选择。通过NoSQL我们不必要再将所有数据都转化成关系数据模式。而今最大的挑战没过于每个领域系统中数据持久模型的选择及后续模型的紧密集合。有很多方法可以用于解决这个问题,通用的方法一般是PolyglotPeristence。下面我们来看一下如何通过Java、Spring、Hibernate和PostgreSQL将普通的SQL模型与key-valueNoSQL模型紧密的集合起来。

本文涉及到一个简单的网络应用程序,这个程序使用了常规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 { 
 
   @Id 
   @GeneratedValue 
    public Integerid; 
 
    @Column(nullable =false) 
    public Stringname; 
 
    @Type(type ="hstore") 
    @Column(columnDefinition= "hstore") 
    public MapcontactMethods = new HashMap(); 
 
如果你熟知Hibernate/JPA的话,那么以上这些对于你来说都会非常的熟悉。而吸引你的陌生之处在于contactMethods对象的修饰—Map,并且还使用了PostgreSQL的hostore数据类型。为了正常运行,hostore数据的类型必须被定义以及columnDefinition集。这不得不再次感谢JakubGluszecki对HstoreHelper和HostoreUserTyper的整合,否则的话这一切都无法实现。

因为只是简单的Hibernate/JPA,剩下的就比较简单了。下面是做基本查询和修改的ContactService类:

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 { 
 
   @PersistenceContext 
    EntityManager em; 
 
   @Override 
    public voidaddContact(Contact contact) {  
       em.persist(contact);  
    } 
 
   @Override 
    public ListgetAllContacts() {  
       CriteriaQuery c =em.getCriteriaBuilder().createQuery(Contact.class); 
       c.from(Contact.class);  
       return em.createQuery(c).getResultList(); 
    } 
     
    public ContactgetContact(Integer id) {  
       return em.find(Contact.class, id); 
    } 
 
   @Override 
    public voidaddContactMethod(Integer contactId, String name, String value) { 
       Contact contact = getContact(contactId); 
       contact.contactMethods.put(name, value); 
    } 
     
在你了解它的工作机制后,我们要开始尝试在Heroku上面的演示了。

如果你想在本地或者Heroku上运行这个应用程序,那么首先你必须提取源代码然后继续新建spring_hibernate_hstore_demo目录的工作:

$ git clonehttps://github.com/jamesward/spring_hibernate_hstore_demo.git 
$ cd spring_hibernate_hstore_demo  
在本地运行需要做的工作:

1. 通过新建到pssql上的连接来允许PostgreSQL数据库对hstore的支持:

$ 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 
5.通知Heroku完成基于刚添加数据库上的DATABASE_USL设置(手动重置YOUR_HEROKU_POSTGESQL_COLOR_URL):

$ heroku pg:promoteYOUR_HEROKU_POSTGRESQL_COLOR_URL 
6. 打开到数据库的psql连接:

$ heroku pg:psql 
7. 让hstore完成对你数据库的支持:

=> create extension hstore;  
=> \q   
8. 部署应用程序:

$ git push heroku master  
9. 在云端查看应用程序:

$ heroku open   
在这里我们完成了使用postgresql、hibernate、spring、java在SQL数据库中实现NoSQL的全部演示,而在集思广益下NoSQL与SQL的融合也必将更加完美!(编译/仲浩包研/责编 原文来自James Ward)

转载于:https://www.cnblogs.com/leeeee/p/7276656.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值