thingsboard-developers

Entity DAOs

5/7/2017 1:07:20 AM

Changes

Details

diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
index b090d7d..25393fb 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/AdminSettingsEntity.java
@@ -22,15 +22,21 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
 import org.thingsboard.server.common.data.AdminSettings;
 import org.thingsboard.server.common.data.id.AdminSettingsId;
 import org.thingsboard.server.dao.model.BaseEntity;
 
+import java.io.IOException;
 import java.util.UUID;
 
 import static org.thingsboard.server.dao.model.ModelConstants.*;
 
-//@Entity
+@Data
+@Slf4j
+@Entity
 @Table(name = ADMIN_SETTINGS_COLUMN_FAMILY_NAME)
 public final class AdminSettingsEntity implements BaseEntity<AdminSettings> {
 
@@ -45,7 +51,7 @@ public final class AdminSettingsEntity implements BaseEntity<AdminSettings> {
     private String key;
 
     @Column(name = ADMIN_SETTINGS_JSON_VALUE_PROPERTY)
-    private JsonNode jsonValue;
+    private String jsonValue;
 
     public AdminSettingsEntity() {
         super();
@@ -56,33 +62,21 @@ public final class AdminSettingsEntity implements BaseEntity<AdminSettings> {
             this.id = adminSettings.getId().getId();
         }
         this.key = adminSettings.getKey();
-        this.jsonValue = adminSettings.getJsonValue();
+        if (jsonValue != null) {
+            this.jsonValue = adminSettings.getJsonValue().toString();
+        }
     }
-    
+
+    @Override
     public UUID getId() {
         return id;
     }
 
+    @Override
     public void setId(UUID id) {
         this.id = id;
     }
     
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public JsonNode getJsonValue() {
-        return jsonValue;
-    }
-
-    public void setJsonValue(JsonNode jsonValue) {
-        this.jsonValue = jsonValue;
-    }
-
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -138,7 +132,16 @@ public final class AdminSettingsEntity implements BaseEntity<AdminSettings> {
         AdminSettings adminSettings = new AdminSettings(new AdminSettingsId(id));
         adminSettings.setCreatedTime(UUIDs.unixTimestamp(id));
         adminSettings.setKey(key);
-        adminSettings.setJsonValue(jsonValue);
+        if (jsonValue != null) {
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode jsonNode = null;
+            try {
+                jsonNode = mapper.readTree(jsonValue);
+                adminSettings.setJsonValue(jsonNode);
+            } catch (IOException e) {
+               log.error(e.getMessage(), e);
+            }
+        }
         return adminSettings;
     }
 
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
index f32a89e..37fab4f 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/ComponentDescriptorEntity.java
@@ -21,6 +21,9 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
 import org.thingsboard.server.common.data.id.ComponentDescriptorId;
 import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
 import org.thingsboard.server.common.data.plugin.ComponentScope;
@@ -28,12 +31,12 @@ import org.thingsboard.server.common.data.plugin.ComponentType;
 import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 
+import java.io.IOException;
 import java.util.UUID;
 
-/**
- * @author Andrew Shvayka
- */
-//@Entity
+@Data
+@Slf4j
+@Entity
 @Table(name = ModelConstants.COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME)
 public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDescriptor> {
 
@@ -57,7 +60,7 @@ public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDesc
     private String clazz;
 
     @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_CONFIGURATION_DESCRIPTOR_PROPERTY)
-    private JsonNode configurationDescriptor;
+    private String configurationDescriptor;
 
     @Column(name = ModelConstants.COMPONENT_DESCRIPTOR_ACTIONS_PROPERTY)
     private String actions;
@@ -77,7 +80,9 @@ public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDesc
         this.scope = component.getScope();
         this.name = component.getName();
         this.clazz = component.getClazz();
-        this.configurationDescriptor = component.getConfigurationDescriptor();
+        if (configurationDescriptor != null) {
+            this.configurationDescriptor = component.getConfigurationDescriptor().toString();
+        }
         this.searchText = component.getName();
     }
 
@@ -89,7 +94,16 @@ public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDesc
         data.setName(this.getName());
         data.setClazz(this.getClazz());
         data.setActions(this.getActions());
-        data.setConfigurationDescriptor(this.getConfigurationDescriptor());
+        if (configurationDescriptor != null) {
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode jsonNode = null;
+            try {
+                jsonNode = mapper.readTree(configurationDescriptor);
+                data.setConfigurationDescriptor(jsonNode);
+            } catch (IOException e) {
+                log.error(e.getMessage(), e);
+            }
+        }
         return data;
     }
 
@@ -103,54 +117,6 @@ public class ComponentDescriptorEntity implements SearchTextEntity<ComponentDesc
         this.id = id;
     }
 
-    public String getActions() {
-        return actions;
-    }
-
-    public void setActions(String actions) {
-        this.actions = actions;
-    }
-
-    public ComponentType getType() {
-        return type;
-    }
-
-    public void setType(ComponentType type) {
-        this.type = type;
-    }
-
-    public ComponentScope getScope() {
-        return scope;
-    }
-
-    public void setScope(ComponentScope scope) {
-        this.scope = scope;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getClazz() {
-        return clazz;
-    }
-
-    public void setClazz(String clazz) {
-        this.clazz = clazz;
-    }
-
-    public JsonNode getConfigurationDescriptor() {
-        return configurationDescriptor;
-    }
-
-    public void setConfigurationDescriptor(JsonNode configurationDescriptor) {
-        this.configurationDescriptor = configurationDescriptor;
-    }
-
     public String getSearchText() {
         return searchText;
     }
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
index b651306..185505b 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/CustomerEntity.java
@@ -22,15 +22,21 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
 import org.thingsboard.server.common.data.Customer;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 
+import java.io.IOException;
 import java.util.UUID;
 
-//@Entity
+@Data
+@Slf4j
+@Entity
 @Table(name = ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME)
 public final class CustomerEntity implements SearchTextEntity<Customer> {
 
@@ -75,7 +81,7 @@ public final class CustomerEntity implements SearchTextEntity<Customer> {
     private String email;
 
     @Column(name = ModelConstants.CUSTOMER_ADDITIONAL_INFO_PROPERTY)
-    private JsonNode additionalInfo;
+    private String additionalInfo;
 
     public CustomerEntity() {
         super();
@@ -95,105 +101,21 @@ public final class CustomerEntity implements SearchTextEntity<Customer> {
         this.zip = customer.getZip();
         this.phone = customer.getPhone();
         this.email = customer.getEmail();
-        this.additionalInfo = customer.getAdditionalInfo();
+        if (additionalInfo != null) {
+            this.additionalInfo = customer.getAdditionalInfo().toString();
+        }
     }
-    
+
+    @Override
     public UUID getId() {
         return id;
     }
 
+    @Override
     public void setId(UUID id) {
         this.id = id;
     }
 
-    public UUID getTenantId() {
-        return tenantId;
-    }
-
-    public void setTenantId(UUID tenantId) {
-        this.tenantId = tenantId;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getCountry() {
-        return country;
-    }
-
-    public void setCountry(String country) {
-        this.country = country;
-    }
-
-    public String getState() {
-        return state;
-    }
-
-    public void setState(String state) {
-        this.state = state;
-    }
-
-    public String getCity() {
-        return city;
-    }
-
-    public void setCity(String city) {
-        this.city = city;
-    }
-
-    public String getAddress() {
-        return address;
-    }
-
-    public void setAddress(String address) {
-        this.address = address;
-    }
-
-    public String getAddress2() {
-        return address2;
-    }
-
-    public void setAddress2(String address2) {
-        this.address2 = address2;
-    }
-
-    public String getZip() {
-        return zip;
-    }
-
-    public void setZip(String zip) {
-        this.zip = zip;
-    }
-
-    public String getPhone() {
-        return phone;
-    }
-
-    public void setPhone(String phone) {
-        this.phone = phone;
-    }
-
-    public String getEmail() {
-        return email;
-    }
-
-    public void setEmail(String email) {
-        this.email = email;
-    }
-
-    public JsonNode getAdditionalInfo() {
-        return additionalInfo;
-    }
-
-    public void setAdditionalInfo(JsonNode additionalInfo) {
-        this.additionalInfo = additionalInfo;
-    }
-    
     @Override
     public String getSearchTextSource() {
         return title;
@@ -204,10 +126,6 @@ public final class CustomerEntity implements SearchTextEntity<Customer> {
         this.searchText = searchText;
     }
     
-    public String getSearchText() {
-        return searchText;
-    }
-
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -344,8 +262,15 @@ public final class CustomerEntity implements SearchTextEntity<Customer> {
         customer.setZip(zip);
         customer.setPhone(phone);
         customer.setEmail(email);
-        customer.setAdditionalInfo(additionalInfo);
+        if (additionalInfo != null) {
+            ObjectMapper mapper = new ObjectMapper();
+            try {
+                JsonNode jsonNode = mapper.readTree(additionalInfo);
+                customer.setAdditionalInfo(jsonNode);
+            } catch (IOException e) {
+               log.error(e.getMessage(), e);
+            }
+        }
         return customer;
     }
-
 }
\ No newline at end of file
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
index 77e12e2..1ad0f84 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardEntity.java
@@ -22,6 +22,9 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
 import org.thingsboard.server.common.data.Dashboard;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.DashboardId;
@@ -29,9 +32,12 @@ import org.thingsboard.server.common.data.id.TenantId;
 import org.thingsboard.server.dao.model.ModelConstants;
 import org.thingsboard.server.dao.model.SearchTextEntity;
 
+import java.io.IOException;
 import java.util.UUID;
 
-//@Entity
+@Data
+@Slf4j
+@Entity
 @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
 public final class DashboardEntity implements SearchTextEntity<Dashboard> {
 
@@ -55,7 +61,7 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> {
     private String searchText;
     
     @Column(name = ModelConstants.DASHBOARD_CONFIGURATION_PROPERTY)
-    private JsonNode configuration;
+    private String configuration;
 
     public DashboardEntity() {
         super();
@@ -72,47 +78,18 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> {
             this.customerId = dashboard.getCustomerId().getId();
         }
         this.title = dashboard.getTitle();
-        this.configuration = dashboard.getConfiguration();
+        if (configuration != null) {
+            this.configuration = dashboard.getConfiguration().toString();
+        }
     }
-    
+
+    @Override
     public UUID getId() {
         return id;
     }
 
+    @Override
     public void setId(UUID id) {
-        this.id = id;
-    }
-
-    public UUID getTenantId() {
-        return tenantId;
-    }
-
-    public void setTenantId(UUID tenantId) {
-        this.tenantId = tenantId;
-    }
-
-    public UUID getCustomerId() {
-        return customerId;
-    }
-
-    public void setCustomerId(UUID customerId) {
-        this.customerId = customerId;
-    }
-    
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public JsonNode getConfiguration() {
-        return configuration;
-    }
-
-    public void setConfiguration(JsonNode configuration) {
-        this.configuration = configuration;
     }
     
     @Override
@@ -214,8 +191,16 @@ public final class DashboardEntity implements SearchTextEntity<Dashboard> {
             dashboard.setCustomerId(new CustomerId(customerId));
         }
         dashboard.setTitle(title);
-        dashboard.setConfiguration(configuration);
+        if (configuration != null) {
+            ObjectMapper mapper = new ObjectMapper();
+            JsonNode jsonNode = null;
+            try {
+                jsonNode = mapper.readTree(configuration);
+                dashboard.setConfiguration(jsonNode);
+            } catch (IOException e) {
+                log.error(e.getMessage(), e);
+            }
+        }
         return dashboard;
     }
-
 }
\ No newline at end of file
diff --git a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
index f0a50f1..e5f1400 100644
--- a/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
+++ b/dao/src/main/java/org/thingsboard/server/dao/model/sql/DashboardInfoEntity.java
@@ -21,6 +21,8 @@ import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.persistence.Transient;
+
+import lombok.Data;
 import org.thingsboard.server.common.data.DashboardInfo;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.DashboardId;
@@ -30,7 +32,8 @@ import org.thingsboard.server.dao.model.SearchTextEntity;
 
 import java.util.UUID;
 
-//@Entity
+@Data
+@Entity
 @Table(name = ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME)
 public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> {
 
@@ -70,38 +73,6 @@ public class DashboardInfoEntity implements SearchTextEntity<DashboardInfo> {
         this.title = dashboardInfo.getTitle();
     }
 
-    public UUID getId() {
-        return id;
-    }
-
-    public void setId(UUID id) {
-        this.id = id;
-    }
-
-    public UUID getTenantId() {
-        return tenantId;
-    }
-
-    public void setTenantId(UUID tenantId) {
-        this.tenantId = tenantId;
-    }
-
-    public UUID getCustomerId() {
-        return customerId;
-    }
-
-    public void setCustomerId(UUID customerId) {
-        this.customerId = customerId;
-    }
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
     @Override
     public String getSearchTextSource() {
         return title;
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
new file mode 100644
index 0000000..a844370
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/ComponentDescriptorRepository.java
@@ -0,0 +1,45 @@
+package org.thingsboard.server.dao.sql.component;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.common.data.plugin.ComponentScope;
+import org.thingsboard.server.common.data.plugin.ComponentType;
+import org.thingsboard.server.dao.model.ToData;
+import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public interface ComponentDescriptorRepository extends CrudRepository<ComponentDescriptorEntity, UUID> {
+
+    ComponentDescriptorEntity findByClazz(String clazz);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "ORDER BY ID LIMIT ?1")
+    List<ComponentDescriptorEntity> findByTypeFirstPage(int limit, int type, String textSearch);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "AND ID > ?4 ORDER BY ID LIMIT ?1")
+    List<ComponentDescriptorEntity> findByTypeNextPage(int limit, int type, String textSearch, UUID idOffset);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
+            "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
+            "ORDER BY ID LIMIT ?1")
+    List<ComponentDescriptorEntity> findByScopeAndTypeFirstPage(int limit, int type, int scope, String textSearch);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM COMPONENT_DESCRIPTOR WHERE TYPE = ?2 " +
+            "AND SCOPE = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
+            "AND ID > ?5 ORDER BY ID LIMIT ?1")
+    List<ComponentDescriptorEntity> findByScopeAndTypeNextPage(int limit, int type, int scope, String textSearch, UUID idOffset);
+
+    void deleteByClazz(String clazz);
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
new file mode 100644
index 0000000..e6ab86a
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDao.java
@@ -0,0 +1,98 @@
+package org.thingsboard.server.dao.sql.component;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.common.data.id.ComponentDescriptorId;
+import org.thingsboard.server.common.data.page.TextPageLink;
+import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
+import org.thingsboard.server.common.data.plugin.ComponentScope;
+import org.thingsboard.server.common.data.plugin.ComponentType;
+import org.thingsboard.server.dao.DaoUtil;
+import org.thingsboard.server.dao.component.ComponentDescriptorDao;
+import org.thingsboard.server.dao.model.ModelConstants;
+import org.thingsboard.server.dao.model.sql.ComponentDescriptorEntity;
+import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@Component
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public class JpaBaseComponentDescriptorDao extends JpaAbstractSearchTextDao<ComponentDescriptorEntity, ComponentDescriptor>
+    implements ComponentDescriptorDao {
+
+    @Autowired
+    private ComponentDescriptorRepository componentDescriptorRepository;
+
+    @Override
+    protected Class<ComponentDescriptorEntity> getEntityClass() {
+        return ComponentDescriptorEntity.class;
+    }
+
+    @Override
+    protected String getColumnFamilyName() {
+        return ModelConstants.COMPONENT_DESCRIPTOR_COLUMN_FAMILY_NAME;
+    }
+
+    @Override
+    protected CrudRepository<ComponentDescriptorEntity, UUID> getCrudRepository() {
+        return componentDescriptorRepository;
+    }
+
+    @Override
+    public Optional<ComponentDescriptor> saveIfNotExist(ComponentDescriptor component) {
+        boolean exists = componentDescriptorRepository.findOne(component.getId().getId()) != null;
+        if (exists) {
+            return Optional.empty();
+        }
+        return Optional.of(save(component));
+    }
+
+    @Override
+    public ComponentDescriptor findById(ComponentDescriptorId componentId) {
+        return findById(componentId.getId());
+    }
+
+    @Override
+    public ComponentDescriptor findByClazz(String clazz) {
+        return DaoUtil.getData(componentDescriptorRepository.findByClazz(clazz));
+    }
+
+    @Override
+    public List<ComponentDescriptor> findByTypeAndPageLink(ComponentType type, TextPageLink pageLink) {
+        if (pageLink.getIdOffset() == null) {
+            return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeFirstPage(pageLink.getLimit(),
+                    type.ordinal(), pageLink.getTextSearch()));
+        } else {
+            return DaoUtil.convertDataList(componentDescriptorRepository.findByTypeNextPage(pageLink.getLimit(),
+                    type.ordinal(), pageLink.getTextSearch(), pageLink.getIdOffset()));
+        }
+    }
+
+    @Override
+    public List<ComponentDescriptor> findByScopeAndTypeAndPageLink(ComponentScope scope, ComponentType type, TextPageLink pageLink) {
+        if (pageLink.getIdOffset() == null) {
+            return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeFirstPage(pageLink.getLimit(),
+                    type.ordinal(), scope.ordinal(), pageLink.getTextSearch()));
+        } else {
+            return DaoUtil.convertDataList(componentDescriptorRepository.findByScopeAndTypeNextPage(pageLink.getLimit(),
+                    type.ordinal(), scope.ordinal(), pageLink.getTextSearch(), pageLink.getIdOffset()));
+        }
+    }
+
+    @Override
+    public void deleteById(ComponentDescriptorId componentId) {
+        removeById(componentId.getId());
+    }
+
+    @Override
+    public void deleteByClazz(String clazz) {
+        componentDescriptorRepository.deleteByClazz(clazz);
+    }
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
new file mode 100644
index 0000000..9616aa1
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/CustomerRepository.java
@@ -0,0 +1,30 @@
+package org.thingsboard.server.dao.sql.customer;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.thingsboard.server.common.data.Customer;
+import org.thingsboard.server.dao.model.sql.CustomerEntity;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public interface CustomerRepository extends CrudRepository<CustomerEntity, UUID> {
+
+    @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "ORDER BY ID LIMIT ?1")
+    List<CustomerEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "AND ID > ?4 ORDER BY ID LIMIT ?1")
+    List<CustomerEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM CUSTOMER WHERE TENANT_ID = ?1")
+    List<CustomerEntity> findByTenantId(UUID tenantId);
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
new file mode 100644
index 0000000..3d60ade
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDao.java
@@ -0,0 +1,52 @@
+package org.thingsboard.server.dao.sql.customer;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.common.data.Customer;
+import org.thingsboard.server.common.data.page.TextPageLink;
+import org.thingsboard.server.dao.DaoUtil;
+import org.thingsboard.server.dao.customer.CustomerDao;
+import org.thingsboard.server.dao.model.ModelConstants;
+import org.thingsboard.server.dao.model.sql.CustomerEntity;
+import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@Component
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public class JpaCustomerDao extends JpaAbstractSearchTextDao<CustomerEntity, Customer> implements CustomerDao{
+
+    @Autowired
+    private CustomerRepository customerRepository;
+
+    @Override
+    protected Class<CustomerEntity> getEntityClass() {
+        return CustomerEntity.class;
+    }
+
+    @Override
+    protected String getColumnFamilyName() {
+        return ModelConstants.CUSTOMER_COLUMN_FAMILY_NAME;
+    }
+
+    @Override
+    protected CrudRepository<CustomerEntity, UUID> getCrudRepository() {
+        return customerRepository;
+    }
+
+    @Override
+    public List<Customer> findCustomersByTenantId(UUID tenantId, TextPageLink pageLink) {
+        if (pageLink.getIdOffset() == null) {
+           return DaoUtil.convertDataList(customerRepository.findByTenantIdFirstPage(pageLink.getLimit(), tenantId, pageLink.getTextSearch()));
+        } else {
+            return DaoUtil.convertDataList(customerRepository.findByTenantIdNextPage(pageLink.getLimit(), tenantId,
+                    pageLink.getTextSearch(), pageLink.getIdOffset()));
+        }
+    }
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
new file mode 100644
index 0000000..de9a491
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardInfoRepository.java
@@ -0,0 +1,36 @@
+package org.thingsboard.server.dao.sql.dashboard;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.thingsboard.server.dao.model.sql.DashboardInfoEntity;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public interface DashboardInfoRepository extends CrudRepository<DashboardInfoEntity, UUID> {
+
+    @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "ORDER BY ID LIMIT ?1")
+    List<DashboardInfoEntity> findByTenantIdFirstPage(int limit, UUID tenantId, String textSearch);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
+            "AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?3, '%')) " +
+            "AND ID > ?4 ORDER BY ID LIMIT ?1")
+    List<DashboardInfoEntity> findByTenantIdNextPage(int limit, UUID tenantId, String textSearch, UUID idOffset);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
+            "AND CUSTOMER_ID = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
+            "ORDER BY ID LIMIT ?1")
+    List<DashboardInfoEntity> findByTenantIdAndCustomerIdFirstPage(int limit, UUID tenantId, UUID customerId, String textSearch);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM DASHBOARD WHERE TENANT_ID = ?2 " +
+            "AND CUSTOMER_ID = ?3 AND LOWER(SEARCH_TEXT) LIKE LOWER(CONCAT(?4, '%')) " +
+            "AND ID > ?5 ORDER BY ID LIMIT ?1")
+    List<DashboardInfoEntity> findByTenantIdAndCustomerIdNextPage(int limit, UUID tenantId, UUID customerId, String textSearch, UUID idOffset);
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java
new file mode 100644
index 0000000..40b1640
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/DashboardRepository.java
@@ -0,0 +1,14 @@
+package org.thingsboard.server.dao.sql.dashboard;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.repository.CrudRepository;
+import org.thingsboard.server.dao.model.sql.DashboardEntity;
+
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public interface DashboardRepository extends CrudRepository<DashboardEntity, UUID> {
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java
new file mode 100644
index 0000000..6bc51bb
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardDao.java
@@ -0,0 +1,40 @@
+package org.thingsboard.server.dao.sql.dashboard;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.common.data.Dashboard;
+import org.thingsboard.server.dao.dashboard.DashboardDao;
+import org.thingsboard.server.dao.model.sql.DashboardEntity;
+import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
+
+import java.util.UUID;
+
+import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@Component
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public class JpaDashboardDao extends JpaAbstractSearchTextDao<DashboardEntity, Dashboard> implements DashboardDao {
+
+    @Autowired
+    DashboardRepository dashboardRepository;
+
+    @Override
+    protected Class<DashboardEntity> getEntityClass() {
+        return DashboardEntity.class;
+    }
+
+    @Override
+    protected String getColumnFamilyName() {
+        return DASHBOARD_COLUMN_FAMILY_NAME;
+    }
+
+    @Override
+    protected CrudRepository<DashboardEntity, UUID> getCrudRepository() {
+        return dashboardRepository;
+    }
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
new file mode 100644
index 0000000..bfeaec0
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDao.java
@@ -0,0 +1,65 @@
+package org.thingsboard.server.dao.sql.dashboard;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.stereotype.Component;
+import org.thingsboard.server.common.data.DashboardInfo;
+import org.thingsboard.server.common.data.page.TextPageLink;
+import org.thingsboard.server.dao.DaoUtil;
+import org.thingsboard.server.dao.dashboard.DashboardInfoDao;
+import org.thingsboard.server.dao.model.sql.DashboardInfoEntity;
+import org.thingsboard.server.dao.sql.JpaAbstractSearchTextDao;
+
+import java.util.List;
+import java.util.UUID;
+
+import static org.thingsboard.server.dao.model.ModelConstants.DASHBOARD_COLUMN_FAMILY_NAME;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+@Component
+@ConditionalOnProperty(prefix = "sql", value = "enabled", havingValue = "true", matchIfMissing = false)
+public class JpaDashboardInfoDao extends JpaAbstractSearchTextDao<DashboardInfoEntity, DashboardInfo> implements DashboardInfoDao {
+
+    @Autowired
+    private DashboardInfoRepository dashboardInfoRepository;
+
+    @Override
+    protected Class getEntityClass() {
+        return DashboardInfoEntity.class;
+    }
+
+    @Override
+    protected String getColumnFamilyName() {
+        return DASHBOARD_COLUMN_FAMILY_NAME;
+    }
+
+    @Override
+    protected CrudRepository getCrudRepository() {
+        return dashboardInfoRepository;
+    }
+
+    @Override
+    public List<DashboardInfo> findDashboardsByTenantId(UUID tenantId, TextPageLink pageLink) {
+        if (pageLink.getIdOffset() == null) {
+            return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdFirstPage(
+                    pageLink.getLimit(), tenantId, pageLink.getTextSearch()));
+        } else {
+            return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdNextPage(
+                    pageLink.getLimit(), tenantId, pageLink.getTextSearch(), pageLink.getIdOffset()));
+        }
+    }
+
+    @Override
+    public List<DashboardInfo> findDashboardsByTenantIdAndCustomerId(UUID tenantId, UUID customerId, TextPageLink pageLink) {
+        if (pageLink.getIdOffset() == null) {
+            return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdFirstPage(
+                    pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch()));
+        } else {
+            return DaoUtil.convertDataList(dashboardInfoRepository.findByTenantIdAndCustomerIdNextPage(
+                    pageLink.getLimit(), tenantId, customerId, pageLink.getTextSearch(), pageLink.getIdOffset()));
+        }
+    }
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java
new file mode 100644
index 0000000..ce54d00
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/AdminSettingsRepository.java
@@ -0,0 +1,15 @@
+package org.thingsboard.server.dao.sql.settings;
+
+import org.springframework.data.repository.CrudRepository;
+import org.thingsboard.server.dao.model.ToData;
+import org.thingsboard.server.dao.model.sql.AdminSettingsEntity;
+
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+public interface AdminSettingsRepository extends CrudRepository<AdminSettingsEntity, UUID> {
+
+    AdminSettingsEntity findByKey(String key);
+}
diff --git a/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java
new file mode 100644
index 0000000..98f4467
--- /dev/null
+++ b/dao/src/main/java/org/thingsboard/server/dao/sql/settings/JpaAdminSettingsDao.java
@@ -0,0 +1,42 @@
+package org.thingsboard.server.dao.sql.settings;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.repository.CrudRepository;
+import org.thingsboard.server.common.data.AdminSettings;
+import org.thingsboard.server.dao.DaoUtil;
+import org.thingsboard.server.dao.model.sql.AdminSettingsEntity;
+import org.thingsboard.server.dao.settings.AdminSettingsDao;
+import org.thingsboard.server.dao.sql.JpaAbstractDao;
+
+import java.util.UUID;
+
+import static org.thingsboard.server.dao.model.ModelConstants.ADMIN_SETTINGS_COLUMN_FAMILY_NAME;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+public class JpaAdminSettingsDao extends JpaAbstractDao<AdminSettingsEntity, AdminSettings> implements AdminSettingsDao{
+
+    @Autowired
+    private AdminSettingsRepository adminSettingsRepository;
+
+    @Override
+    protected Class<AdminSettingsEntity> getEntityClass() {
+        return AdminSettingsEntity.class;
+    }
+
+    @Override
+    protected String getColumnFamilyName() {
+        return ADMIN_SETTINGS_COLUMN_FAMILY_NAME;
+    }
+
+    @Override
+    protected CrudRepository<AdminSettingsEntity, UUID> getCrudRepository() {
+        return adminSettingsRepository;
+    }
+
+    @Override
+    public AdminSettings findByKey(String key) {
+        return DaoUtil.getData(adminSettingsRepository.findByKey(key));
+    }
+}
diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java
new file mode 100644
index 0000000..08a90c2
--- /dev/null
+++ b/dao/src/test/java/org/thingsboard/server/dao/sql/component/JpaBaseComponentDescriptorDaoTest.java
@@ -0,0 +1,71 @@
+package org.thingsboard.server.dao.sql.component;
+
+import com.datastax.driver.core.utils.UUIDs;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.thingsboard.server.common.data.Customer;
+import org.thingsboard.server.common.data.id.ComponentDescriptorId;
+import org.thingsboard.server.common.data.page.TextPageLink;
+import org.thingsboard.server.common.data.plugin.ComponentDescriptor;
+import org.thingsboard.server.common.data.plugin.ComponentScope;
+import org.thingsboard.server.common.data.plugin.ComponentType;
+import org.thingsboard.server.dao.AbstractJpaDaoTest;
+import org.thingsboard.server.dao.component.ComponentDescriptorDao;
+
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+public class JpaBaseComponentDescriptorDaoTest extends AbstractJpaDaoTest {
+
+    @Autowired
+    private ComponentDescriptorDao componentDescriptorDao;
+
+    @Test
+    public void findByType() {
+        for (int i = 0; i < 20; i++) {
+            createComponentDescriptor(ComponentType.PLUGIN, ComponentScope.SYSTEM, i);
+            createComponentDescriptor(ComponentType.ACTION, ComponentScope.TENANT, i + 20);
+        }
+
+        TextPageLink pageLink1 = new TextPageLink(15, "COMPONENT_");
+        List<ComponentDescriptor> components1 = componentDescriptorDao.findByTypeAndPageLink(ComponentType.PLUGIN, pageLink1);
+        assertEquals(15, components1.size());
+
+        TextPageLink pageLink2 = new TextPageLink(15, "COMPONENT_", components1.get(14).getId().getId(), null);
+        List<ComponentDescriptor> components2 = componentDescriptorDao.findByTypeAndPageLink(ComponentType.PLUGIN, pageLink2);
+        assertEquals(5, components2.size());
+    }
+
+    @Test
+    public void findByTypeAndSocpe() {
+        for (int i = 0; i < 20; i++) {
+            createComponentDescriptor(ComponentType.PLUGIN, ComponentScope.SYSTEM, i);
+            createComponentDescriptor(ComponentType.ACTION, ComponentScope.TENANT, i + 20);
+            createComponentDescriptor(ComponentType.FILTER, ComponentScope.SYSTEM, i + 40);
+        }
+
+        TextPageLink pageLink1 = new TextPageLink(15, "COMPONENT_");
+        List<ComponentDescriptor> components1 = componentDescriptorDao.findByScopeAndTypeAndPageLink(
+                ComponentScope.SYSTEM, ComponentType.FILTER, pageLink1);
+        assertEquals(15, components1.size());
+
+        TextPageLink pageLink2 = new TextPageLink(15, "COMPONENT_", components1.get(14).getId().getId(), null);
+        List<ComponentDescriptor> components2 = componentDescriptorDao.findByScopeAndTypeAndPageLink(
+                ComponentScope.SYSTEM, ComponentType.FILTER, pageLink2);
+        assertEquals(5, components2.size());
+    }
+
+    private void createComponentDescriptor(ComponentType type, ComponentScope scope, int index) {
+        ComponentDescriptor component = new ComponentDescriptor();
+        component.setId(new ComponentDescriptorId(UUIDs.timeBased()));
+        component.setType(type);
+        component.setScope(scope);
+        component.setName("COMPONENT_" + index);
+        componentDescriptorDao.save(component);
+    }
+
+}
diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java
new file mode 100644
index 0000000..f300611
--- /dev/null
+++ b/dao/src/test/java/org/thingsboard/server/dao/sql/customer/JpaCustomerDaoTest.java
@@ -0,0 +1,52 @@
+package org.thingsboard.server.dao.sql.customer;
+
+import com.datastax.driver.core.utils.UUIDs;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.thingsboard.server.common.data.Customer;
+import org.thingsboard.server.common.data.id.CustomerId;
+import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.common.data.page.TextPageLink;
+import org.thingsboard.server.dao.AbstractJpaDaoTest;
+import org.thingsboard.server.dao.customer.CustomerDao;
+
+import java.util.List;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+public class JpaCustomerDaoTest extends AbstractJpaDaoTest {
+
+    @Autowired
+    private CustomerDao customerDao;
+
+    @Test
+    public void testFindByTenantId() {
+        UUID tenantId1 = UUIDs.timeBased();
+        UUID tenantId2 = UUIDs.timeBased();
+
+        for (int i = 0; i < 20; i++) {
+            createCustomer(tenantId1, i);
+            createCustomer(tenantId2, i * 2);
+        }
+
+        TextPageLink pageLink1 = new TextPageLink(15, "CUSTOMER");
+        List<Customer> customers1 = customerDao.findCustomersByTenantId(tenantId1, pageLink1);
+        assertEquals(15, customers1.size());
+
+        TextPageLink pageLink2 = new TextPageLink(15, "CUSTOMER", customers1.get(14).getId().getId(), null);
+        List<Customer> customers2 = customerDao.findCustomersByTenantId(tenantId1, pageLink2);
+        assertEquals(5, customers2.size());
+    }
+
+    private void createCustomer(UUID tenantId, int index) {
+        Customer customer = new Customer();
+        customer.setId(new CustomerId(UUIDs.timeBased()));
+        customer.setTenantId(new TenantId(tenantId));
+        customer.setTitle("CUSTOMER_" + index);
+        customerDao.save(customer);
+    }
+}
diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java
new file mode 100644
index 0000000..1360ea4
--- /dev/null
+++ b/dao/src/test/java/org/thingsboard/server/dao/sql/dashboard/JpaDashboardInfoDaoTest.java
@@ -0,0 +1,78 @@
+package org.thingsboard.server.dao.sql.dashboard;
+
+import com.datastax.driver.core.utils.UUIDs;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.thingsboard.server.common.data.DashboardInfo;
+import org.thingsboard.server.common.data.id.CustomerId;
+import org.thingsboard.server.common.data.id.DashboardId;
+import org.thingsboard.server.common.data.id.TenantId;
+import org.thingsboard.server.common.data.page.TextPageLink;
+import org.thingsboard.server.dao.AbstractJpaDaoTest;
+import org.thingsboard.server.dao.dashboard.DashboardInfoDao;
+
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * Created by Valerii Sosliuk on 5/6/2017.
+ */
+public class JpaDashboardInfoDaoTest extends AbstractJpaDaoTest {
+
+    @Autowired
+    private DashboardInfoDao dashboardInfoDao;
+
+    @Test
+    public void testFindDashboardsByTenantId() {
+        UUID tenantId1 = UUIDs.timeBased();
+        UUID customerId1 = UUIDs.timeBased();
+        UUID tenantId2 = UUIDs.timeBased();
+        UUID customerId2 = UUIDs.timeBased();
+
+        for (int i = 0; i < 20; i++) {
+            createDashboard(tenantId1, customerId1, i);
+            createDashboard(tenantId2, customerId2, i * 2);
+        }
+
+        TextPageLink pageLink1 = new TextPageLink(15, "DASHBOARD");
+        List<DashboardInfo> dashboardInfos1 = dashboardInfoDao.findDashboardsByTenantId(tenantId1, pageLink1);
+        assertEquals(15, dashboardInfos1.size());
+
+        TextPageLink pageLink2 = new TextPageLink(15, "DASHBOARD", dashboardInfos1.get(14).getId().getId(), null);
+        List<DashboardInfo> dashboardInfos2 = dashboardInfoDao.findDashboardsByTenantId(tenantId1, pageLink2);
+        assertEquals(5, dashboardInfos2.size());
+    }
+
+    @Test
+    public void testFindDashboardsByTenantAndCustomerId() {
+        UUID tenantId1 = UUIDs.timeBased();
+        UUID customerId1 = UUIDs.timeBased();
+        UUID tenantId2 = UUIDs.timeBased();
+        UUID customerId2 = UUIDs.timeBased();
+
+        for (int i = 0; i < 20; i++) {
+            createDashboard(tenantId1, customerId1, i);
+            createDashboard(tenantId2, customerId2, i * 2);
+        }
+
+        TextPageLink pageLink1 = new TextPageLink(15, "DASHBOARD");
+        List<DashboardInfo> dashboardInfos1 = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId1, customerId1, pageLink1);
+        assertEquals(15, dashboardInfos1.size());
+
+        TextPageLink pageLink2 = new TextPageLink(15, "DASHBOARD", dashboardInfos1.get(14).getId().getId(), null);
+        List<DashboardInfo> dashboardInfos2 = dashboardInfoDao.findDashboardsByTenantIdAndCustomerId(tenantId1, customerId1, pageLink2);
+        assertEquals(5, dashboardInfos2.size());
+    }
+
+    private void assertEquals(int i, int size) {
+    }
+
+    private void createDashboard(UUID tenantId, UUID customerId, int index) {
+        DashboardInfo dashboardInfo = new DashboardInfo();
+        dashboardInfo.setId(new DashboardId(UUIDs.timeBased()));
+        dashboardInfo.setTenantId(new TenantId(tenantId));
+        dashboardInfo.setCustomerId(new CustomerId(customerId));
+        dashboardInfo.setTitle("DASHBOARD_" + index);
+        dashboardInfoDao.save(dashboardInfo);
+    }
+}
diff --git a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java
index 4f1b315..58507af 100644
--- a/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java
+++ b/dao/src/test/java/org/thingsboard/server/dao/sql/device/JpaDeviceDaoTest.java
@@ -1,13 +1,11 @@
 package org.thingsboard.server.dao.sql.device;
 
 import com.datastax.driver.core.utils.UUIDs;
-import com.github.springtestdbunit.annotation.DatabaseOperation;
-import com.github.springtestdbunit.annotation.DatabaseSetup;
-import com.github.springtestdbunit.annotation.DatabaseTearDown;
-import com.google.common.util.concurrent.*;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
 import org.thingsboard.server.common.data.Device;
 import org.thingsboard.server.common.data.id.CustomerId;
 import org.thingsboard.server.common.data.id.DeviceId;
@@ -17,7 +15,6 @@ import org.thingsboard.server.dao.AbstractJpaDaoTest;
 import org.thingsboard.server.dao.device.DeviceDao;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
@@ -29,15 +26,12 @@ import static org.junit.Assert.assertNotNull;
 /**
  * Created by Valerii Sosliuk on 5/6/2017.
  */
-@Transactional
 public class JpaDeviceDaoTest extends AbstractJpaDaoTest {
 
     @Autowired
     private DeviceDao deviceDao;
 
     @Test
-    @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
-    @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
     public void testFindDevicesByTenantId() {
         UUID tenantId1 = UUIDs.timeBased();
         UUID tenantId2 = UUIDs.timeBased();
@@ -55,8 +49,6 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest {
     }
 
     @Test
-    @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
-    @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
     public void testFindAsync() throws ExecutionException, InterruptedException {
         UUID tenantId = UUIDs.timeBased();
         UUID customerId = UUIDs.timeBased();
@@ -75,8 +67,6 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest {
     }
 
     @Test
-    @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
-    @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
     public void testFindDevicesByTenantIdAndIdsAsync() throws ExecutionException, InterruptedException {
         UUID tenantId1 = UUIDs.timeBased();
         UUID customerId1 = UUIDs.timeBased();
@@ -100,8 +90,6 @@ public class JpaDeviceDaoTest extends AbstractJpaDaoTest {
     }
 
     @Test
-    @DatabaseSetup(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
-    @DatabaseTearDown(value = "classpath:dbunit/empty_dataset.xml",type = DatabaseOperation.DELETE_ALL)
     public void testFindDevicesByTenantIdAndCustomerIdAndIdsAsync() throws ExecutionException, InterruptedException {
         UUID tenantId1 = UUIDs.timeBased();
         UUID customerId1 = UUIDs.timeBased();
diff --git a/dao/src/test/resources/jpa-test.properties b/dao/src/test/resources/jpa-test.properties
index f887e08..54025ab 100644
--- a/dao/src/test/resources/jpa-test.properties
+++ b/dao/src/test/resources/jpa-test.properties
@@ -1,10 +1,6 @@
 cassandra.enabled=false
 
 sql.enabled=true
-#sql.datasource.url=jdbc:h2:mem:thingsboard
-#sql.datasource.username=sa
-#sql.datasource.password=
-#spring.jpa.hibernate.ddl-auto=create-drop
 
 spring.jpa.show-sql=false
 spring.jpa.hibernate.ddl-auto=create-drop