Add data jpa module and project
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
package com.cubetiqs.data.config;
|
||||
|
||||
import com.cubetiqs.data.domain.AuditDetails;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.data.domain.AuditorAware;
|
||||
|
||||
/**
|
||||
* Auditor Aware Configurer
|
||||
*
|
||||
* @author sombochea
|
||||
* @see AuditorAware
|
||||
* @see AuditDetails
|
||||
* @since 1.0
|
||||
*/
|
||||
public interface AuditorAwareConfigurer {
|
||||
String AUDITOR_AWARE_BEAN = "auditorAware";
|
||||
|
||||
@Bean
|
||||
default AuditorAware<AuditDetails> auditorAware() {
|
||||
return new AuditorAwareImpl();
|
||||
}
|
||||
}
|
||||
25
src/main/java/com/cubetiqs/data/config/AuditorAwareImpl.java
Normal file
25
src/main/java/com/cubetiqs/data/config/AuditorAwareImpl.java
Normal file
@@ -0,0 +1,25 @@
|
||||
package com.cubetiqs.data.config;
|
||||
|
||||
import com.cubetiqs.data.domain.AuditDetails;
|
||||
import org.springframework.data.domain.AuditorAware;
|
||||
import org.springframework.lang.NonNull;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Audit Aware Impl
|
||||
*
|
||||
* @author sombochea
|
||||
* @see AuditorAware
|
||||
* @see AuditDetails
|
||||
* @since 1.0
|
||||
*/
|
||||
public class AuditorAwareImpl implements AuditorAware<AuditDetails> {
|
||||
private final static String SYSTEM = "admin";
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Optional<AuditDetails> getCurrentAuditor() {
|
||||
return Optional.of(new AuditDetails(SYSTEM));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.cubetiqs.data.config;
|
||||
|
||||
import com.cubetiqs.data.repository.BaseRepositoryImpl;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Persistence Configuration Context.
|
||||
* This identifier used for boot config and app base packages and repositories bean.
|
||||
* Default scan components are "com.cubetiqs" and "com.cubetiqs.data.repository" for current base repository registration.
|
||||
*
|
||||
* @author sombochea
|
||||
* @see Target
|
||||
* @see Retention
|
||||
* @see Configuration
|
||||
* @see EnableJpaRepositories
|
||||
* @see EnableTransactionManagement
|
||||
* @see BaseRepositoryImpl
|
||||
* @since 1.0
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Configuration
|
||||
@EnableJpaRepositories(
|
||||
basePackages = {"com.cubetiqs.data.repository", "com.cubetiqs"},
|
||||
repositoryBaseClass = BaseRepositoryImpl.class
|
||||
)
|
||||
@EnableTransactionManagement
|
||||
public @interface PersistenceContext {
|
||||
}
|
||||
30
src/main/java/com/cubetiqs/data/domain/AuditDetails.java
Normal file
30
src/main/java/com/cubetiqs/data/domain/AuditDetails.java
Normal file
@@ -0,0 +1,30 @@
|
||||
package com.cubetiqs.data.domain;
|
||||
|
||||
import javax.persistence.Embeddable;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Audit Details
|
||||
*
|
||||
* @author sombochea
|
||||
* @since 1.0
|
||||
*/
|
||||
@Embeddable
|
||||
public class AuditDetails implements Serializable {
|
||||
private String createdBy;
|
||||
|
||||
public void setCreatedBy(String createdBy) {
|
||||
this.createdBy = createdBy;
|
||||
}
|
||||
|
||||
public String getCreatedBy() {
|
||||
return createdBy;
|
||||
}
|
||||
|
||||
public AuditDetails() {
|
||||
}
|
||||
|
||||
public AuditDetails(String createdBy) {
|
||||
this.createdBy = createdBy;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.cubetiqs.data.domain;
|
||||
|
||||
import org.springframework.data.annotation.CreatedBy;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
import org.springframework.data.annotation.LastModifiedBy;
|
||||
import org.springframework.data.annotation.LastModifiedDate;
|
||||
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Base Domain Model
|
||||
*
|
||||
* @author sombochea
|
||||
* @see BaseEntity
|
||||
* @since 1.0
|
||||
*/
|
||||
@MappedSuperclass
|
||||
@EntityListeners(AuditingEntityListener.class)
|
||||
public abstract class BaseAuditDomainModel<ID extends Serializable> extends BaseDomainModel<ID> {
|
||||
@Embedded
|
||||
@AttributeOverride(
|
||||
name = "createdBy",
|
||||
column = @Column(name = "created_by")
|
||||
)
|
||||
@CreatedBy
|
||||
private AuditDetails createdBy;
|
||||
|
||||
@CreatedDate
|
||||
private Date createdDate;
|
||||
|
||||
@Embedded
|
||||
@AttributeOverride(
|
||||
name = "createdBy",
|
||||
column = @Column(name = "updated_by")
|
||||
)
|
||||
@LastModifiedBy
|
||||
private AuditDetails updatedBy;
|
||||
|
||||
@LastModifiedDate
|
||||
private Date updatedDate;
|
||||
}
|
||||
36
src/main/java/com/cubetiqs/data/domain/BaseDomainModel.java
Normal file
36
src/main/java/com/cubetiqs/data/domain/BaseDomainModel.java
Normal file
@@ -0,0 +1,36 @@
|
||||
package com.cubetiqs.data.domain;
|
||||
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.GenerationType;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.MappedSuperclass;
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Base Domain Model
|
||||
*
|
||||
* @author sombochea
|
||||
* @see BaseEntity
|
||||
* @since 1.0
|
||||
*/
|
||||
@MappedSuperclass
|
||||
public abstract class BaseDomainModel<ID extends Serializable> implements BaseEntity<ID> {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private ID id;
|
||||
|
||||
@Override
|
||||
public void setId(ID id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ID getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isNew() {
|
||||
return id == null;
|
||||
}
|
||||
}
|
||||
14
src/main/java/com/cubetiqs/data/domain/BaseEntity.java
Normal file
14
src/main/java/com/cubetiqs/data/domain/BaseEntity.java
Normal file
@@ -0,0 +1,14 @@
|
||||
package com.cubetiqs.data.domain;
|
||||
|
||||
import org.springframework.data.domain.Persistable;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* @author sombochea
|
||||
* @see Persistable
|
||||
* @since 1.o
|
||||
*/
|
||||
public interface BaseEntity<ID> extends Persistable<ID>, Serializable {
|
||||
void setId(ID id);
|
||||
}
|
||||
13
src/main/java/com/cubetiqs/data/domain/Queryable.java
Normal file
13
src/main/java/com/cubetiqs/data/domain/Queryable.java
Normal file
@@ -0,0 +1,13 @@
|
||||
package com.cubetiqs.data.domain;
|
||||
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
|
||||
/**
|
||||
* Queryable Specification
|
||||
*
|
||||
* @author sombochea
|
||||
* @see Specification
|
||||
* @since 1.0
|
||||
*/
|
||||
public interface Queryable<T> extends Specification<T> {
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.cubetiqs.data.repository;
|
||||
|
||||
import com.cubetiqs.data.domain.Queryable;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.repository.NoRepositoryBean;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Base Repository
|
||||
*
|
||||
* @author sombochea
|
||||
* @see JpaRepository
|
||||
* @see NoRepositoryBean
|
||||
* @since 1.0
|
||||
*/
|
||||
@NoRepositoryBean
|
||||
public interface BaseRepository<T, ID> extends JpaRepository<T, ID> {
|
||||
List<T> searchByQueryable(Queryable<T> queryable);
|
||||
Page<T> searchByQueryable(Queryable<T> queryable, Pageable pageable);
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.cubetiqs.data.repository;
|
||||
|
||||
import com.cubetiqs.data.domain.Queryable;
|
||||
import com.cubetiqs.logging.Log;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
|
||||
import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
|
||||
import org.springframework.data.repository.NoRepositoryBean;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Base Repository Impl
|
||||
*
|
||||
* @author sombochea
|
||||
* @see BaseRepository
|
||||
* @see SimpleJpaRepository
|
||||
* @since 1.0
|
||||
*/
|
||||
@NoRepositoryBean
|
||||
public class BaseRepositoryImpl<T, ID extends Serializable>
|
||||
extends SimpleJpaRepository<T, ID>
|
||||
implements BaseRepository<T, ID> {
|
||||
private final Logger logger = Log.getLogger(getClass());
|
||||
|
||||
public BaseRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
|
||||
super(entityInformation, entityManager);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> searchByQueryable(Queryable<T> queryable) {
|
||||
List<T> records = findAll(queryable);
|
||||
logger.info("find all records: {}", records.size());
|
||||
return records;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Page<T> searchByQueryable(Queryable<T> queryable, Pageable pageable) {
|
||||
Page<T> records = findAll(queryable, pageable);
|
||||
logger.info("find all records: {} and pages: {}", records.getTotalElements(), records.getTotalPages());
|
||||
return records;
|
||||
}
|
||||
}
|
||||
20
src/main/java/com/cubetiqs/data/service/BaseService.java
Normal file
20
src/main/java/com/cubetiqs/data/service/BaseService.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package com.cubetiqs.data.service;
|
||||
|
||||
import com.cubetiqs.data.repository.BaseRepository;
|
||||
|
||||
/**
|
||||
* Base Service Repository
|
||||
*
|
||||
* @author sombochea
|
||||
* @since 1.0
|
||||
*/
|
||||
@NoServiceBean
|
||||
public interface BaseService<T, ID> {
|
||||
/**
|
||||
* Get current entity repository
|
||||
*
|
||||
* @return BaseRepository | Whole entity repository
|
||||
* @see BaseRepository
|
||||
*/
|
||||
BaseRepository<T, ID> getRepository();
|
||||
}
|
||||
67
src/main/java/com/cubetiqs/data/service/CrudService.java
Normal file
67
src/main/java/com/cubetiqs/data/service/CrudService.java
Normal file
@@ -0,0 +1,67 @@
|
||||
package com.cubetiqs.data.service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Crud Service used for Create, Read, Update and Delete entity
|
||||
*
|
||||
* @author sombochea
|
||||
* @see BaseService
|
||||
* @since 1.0
|
||||
*/
|
||||
@NoServiceBean
|
||||
public interface CrudService<T, ID> extends BaseService<T, ID> {
|
||||
/**
|
||||
* Find all entities
|
||||
*
|
||||
* @return List | Collection of Entity
|
||||
*/
|
||||
List<T> findAll();
|
||||
|
||||
/**
|
||||
* Create new record
|
||||
*
|
||||
* @param entity T
|
||||
* @return T | Get entity back
|
||||
*/
|
||||
T create(T entity);
|
||||
|
||||
/**
|
||||
* Create all entity records
|
||||
*
|
||||
* @param entities List of entities
|
||||
* @return List | Collection of entity
|
||||
*/
|
||||
List<T> createAll(List<T> entities);
|
||||
|
||||
/**
|
||||
* Read one record from entity ID
|
||||
*
|
||||
* @param id ID
|
||||
* @return T | If have, Get entity back or NULL
|
||||
*/
|
||||
T read(ID id);
|
||||
|
||||
/**
|
||||
* Update entity record with entity ID
|
||||
*
|
||||
* @param id ID
|
||||
* @param entity T
|
||||
* @return T | Get entity back, after updated
|
||||
*/
|
||||
T update(ID id, T entity);
|
||||
|
||||
/**
|
||||
* Delete entity record with entity ID
|
||||
*
|
||||
* @param id ID
|
||||
*/
|
||||
void delete(ID id);
|
||||
|
||||
/**
|
||||
* Delete all entity records
|
||||
*
|
||||
* @param ids List of IDs
|
||||
*/
|
||||
void deleteAll(List<ID> ids);
|
||||
}
|
||||
59
src/main/java/com/cubetiqs/data/service/CrudServiceImpl.java
Normal file
59
src/main/java/com/cubetiqs/data/service/CrudServiceImpl.java
Normal file
@@ -0,0 +1,59 @@
|
||||
package com.cubetiqs.data.service;
|
||||
|
||||
import com.cubetiqs.data.domain.BaseEntity;
|
||||
import com.cubetiqs.data.repository.BaseRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Crud Service Impl
|
||||
*
|
||||
* @author sombochea
|
||||
* @since 1.0
|
||||
*/
|
||||
@NoServiceBean
|
||||
public class CrudServiceImpl<T, ID extends BaseEntity<ID>> implements CrudService<T, ID> {
|
||||
@Override
|
||||
public List<T> findAll() {
|
||||
return getRepository().findAll();
|
||||
}
|
||||
|
||||
@Override
|
||||
public T create(T entity) {
|
||||
return getRepository().save(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> createAll(List<T> entities) {
|
||||
return getRepository().saveAll(entities);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T read(ID id) {
|
||||
return getRepository().findById(id).orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T update(ID id, T entity) {
|
||||
T update = read(id);
|
||||
if (update == null) {
|
||||
return null;
|
||||
}
|
||||
return getRepository().save(entity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(ID id) {
|
||||
getRepository().deleteById(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteAll(List<ID> ids) {
|
||||
getRepository().deleteAll(getRepository().findAllById(ids));
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseRepository<T, ID> getRepository() {
|
||||
throw new ServiceNotImplementException("service must be implement!");
|
||||
}
|
||||
}
|
||||
22
src/main/java/com/cubetiqs/data/service/NoServiceBean.java
Normal file
22
src/main/java/com/cubetiqs/data/service/NoServiceBean.java
Normal file
@@ -0,0 +1,22 @@
|
||||
package com.cubetiqs.data.service;
|
||||
|
||||
import org.springframework.data.repository.NoRepositoryBean;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* No Service Bean
|
||||
*
|
||||
* @author sombochea
|
||||
* @see NoRepositoryBean
|
||||
* @since 1.0
|
||||
*/
|
||||
@Target(ElementType.TYPE)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@NoRepositoryBean
|
||||
public @interface NoServiceBean {
|
||||
String value() default "";
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package com.cubetiqs.data.service;
|
||||
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Paging Crud Service
|
||||
* Used for Crud Style, but include pagination support
|
||||
*
|
||||
* @author sombochea
|
||||
* @see CrudService
|
||||
* @since 1.0
|
||||
*/
|
||||
@NoServiceBean
|
||||
public interface PagingCrudService<T, ID> extends CrudService<T, ID> {
|
||||
/**
|
||||
* Find All with pagination
|
||||
*
|
||||
* @param pageable Pageable
|
||||
* @return Page | Page of entity
|
||||
* @see Pageable
|
||||
*/
|
||||
Page<T> findAll(Pageable pageable);
|
||||
|
||||
/**
|
||||
* Find All with pagination and sort
|
||||
*
|
||||
* @param sort Sort
|
||||
* @return List | Collection of entity that sorted
|
||||
* @see Sort
|
||||
*/
|
||||
List<T> findAll(Sort sort);
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.cubetiqs.data.service;
|
||||
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Sort;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Paging Crud Service Impl
|
||||
*
|
||||
* @author sombochea
|
||||
* @see CrudService
|
||||
* @see PagingCrudService
|
||||
* @see CrudServiceImpl
|
||||
* @since 1.0
|
||||
*/
|
||||
@NoServiceBean
|
||||
public class PagingCrudServiceImpl<T, ID> extends CrudServiceImpl<T, ID> implements PagingCrudService<T, ID> {
|
||||
@Override
|
||||
public Page<T> findAll(Pageable pageable) {
|
||||
return getRepository().findAll(pageable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<T> findAll(Sort sort) {
|
||||
return getRepository().findAll(sort);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
package com.cubetiqs.data.service;
|
||||
|
||||
/**
|
||||
* Service not implement exception
|
||||
*
|
||||
* @author sombochea
|
||||
* @see RuntimeException
|
||||
* @since 1.0
|
||||
*/
|
||||
public class ServiceNotImplementException extends RuntimeException {
|
||||
public ServiceNotImplementException() {
|
||||
}
|
||||
|
||||
public ServiceNotImplementException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public ServiceNotImplementException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public ServiceNotImplementException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public ServiceNotImplementException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user