init
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
# =====================================================================
|
||||
# CONVERTER 매핑 (이 프로젝트 전용 키를 여기에 전부 입력)
|
||||
# 형식(세미콜론 구분) : DB컬럼명 ; enum타입(FQN) ; AttributeConverter(FQN)
|
||||
# - 같은 컬럼명을 가진 모든 엔티티에 자동 적용됨
|
||||
# - 새 컨버터가 생기면 이 파일에 한 줄만 추가. 템플릿/엔티티 수정 불필요.
|
||||
# - 특정 테이블만 예외 처리하려면 그 .entity 컬럼에 태그로 override :
|
||||
# myCol : string { ... #javaType(com.x.MyEnum) #converter(com.x.MyEnumConverter) };
|
||||
# =====================================================================
|
||||
|
||||
# ---- shared_kernel 공통 ------------------------------------------------
|
||||
exposure_status ; com.daewoong.shared_kernel.domain.model.Exposure ; com.daewoong.shared_kernel.domain.converter.ExposureStringConverter
|
||||
langcd ; com.daewoong.shared_kernel.domain.model.Lang ; com.daewoong.shared_kernel.domain.converter.LangConverter
|
||||
|
||||
# ---- newsroom.media 도메인 --------------------------------------------
|
||||
media_file_use ; com.daewoong.contexts.newsroom.media.domain.model.UseFlag ; com.daewoong.contexts.newsroom.media.domain.convert.UseFlagConverter
|
||||
media_file_type ; com.daewoong.contexts.newsroom.media.domain.model.MediaFileType ; com.daewoong.contexts.newsroom.media.domain.convert.MediaFileTypeConverter
|
||||
|
@@ -0,0 +1,63 @@
|
||||
## =====================================================================
|
||||
## AUTO IMPORTS SCANNER
|
||||
## type-mapping.csv + converters.csv 의 매칭 행에서 FQN 을 추출해
|
||||
## $extraImports 에 모은다. XxxBase 에서 import 로 emit.
|
||||
## - CSV 는 FQN 으로 작성, 짧은 이름 변환은 자동.
|
||||
## - java.lang.* 는 import 안 함.
|
||||
## Velocity 1.x 산술 미지원 → $foreach.index 사용.
|
||||
## =====================================================================
|
||||
#set( $extraImports = [] )##
|
||||
#foreach( $attribute in $entity.nonKeyAttributes )##
|
||||
#foreach( $row in $typeMapRows )##
|
||||
#if( $row.size() >= 2 && $row.get(0).trim().equals($attribute.databaseName) )##
|
||||
#set( $tStr = $row.get(1).trim() )##
|
||||
#set( $ltI = $tStr.indexOf("<") )##
|
||||
#if( $ltI >= 0 )#set( $bFqn = $tStr.substring(0, $ltI) )#else#set( $bFqn = $tStr )#end##
|
||||
#if( $bFqn.contains(".") && !$bFqn.startsWith("java.lang.") && !$extraImports.contains($bFqn) )##
|
||||
#set( $void = $extraImports.add($bFqn) )##
|
||||
#end##
|
||||
#if( $row.size() >= 3 )##
|
||||
#set( $aStr = $row.get(2).trim() )##
|
||||
#set( $tokens = $aStr.split("[^A-Za-z0-9_.]+") )##
|
||||
#foreach( $tok in $tokens )##
|
||||
#if( $tok.contains(".") )##
|
||||
#set( $segs = $tok.split("[.]") )##
|
||||
#set( $upIdx0 = -1 )##
|
||||
#foreach( $seg in $segs )##
|
||||
#if( $upIdx0 < 0 && $seg.length() > 0 )##
|
||||
#set( $c0 = $seg.substring(0,1) )##
|
||||
#if( !$c0.equals($c0.toLowerCase()) )#set( $upIdx0 = $foreach.index )#end##
|
||||
#end##
|
||||
#end##
|
||||
#if( $upIdx0 > 0 )##
|
||||
#set( $f = "" )##
|
||||
#foreach( $seg in $segs )##
|
||||
#if( $foreach.index == 0 )#set( $f = $seg )#elseif( $foreach.index <= $upIdx0 )#set( $f = "${f}.${seg}" )#end##
|
||||
#end##
|
||||
#if( !$f.startsWith("java.lang.") && !$extraImports.contains($f) )#set( $void = $extraImports.add($f) )#end##
|
||||
#end##
|
||||
#end##
|
||||
#end##
|
||||
#end##
|
||||
#end##
|
||||
#end##
|
||||
#foreach( $row in $convRows )##
|
||||
#if( $row.size() >= 3 && $row.get(0).trim().equals($attribute.databaseName) )##
|
||||
#set( $ct = $row.get(1).trim() )##
|
||||
#if( $ct.contains(".") && !$ct.startsWith("java.lang.") && !$extraImports.contains($ct) )#set( $void = $extraImports.add($ct) )#end##
|
||||
#set( $cc = $row.get(2).trim() )##
|
||||
#if( $cc.contains(".") && !$cc.startsWith("java.lang.") && !$extraImports.contains($cc) )#set( $void = $extraImports.add($cc) )#end##
|
||||
#end##
|
||||
#end##
|
||||
#if( $attribute.hasTag("javaType") )##
|
||||
#set( $jt = $attribute.tagValue("javaType") )##
|
||||
#set( $jtBase = $jt )##
|
||||
#set( $ltJ = $jt.indexOf("<") )##
|
||||
#if( $ltJ >= 0 )#set( $jtBase = $jt.substring(0, $ltJ) )#end##
|
||||
#if( $jtBase.contains(".") && !$jtBase.startsWith("java.lang.") && !$extraImports.contains($jtBase) )#set( $void = $extraImports.add($jtBase) )#end##
|
||||
#end##
|
||||
#if( $attribute.hasTag("converter") )##
|
||||
#set( $cv = $attribute.tagValue("converter") )##
|
||||
#if( $cv.contains(".") && !$cv.startsWith("java.lang.") && !$extraImports.contains($cv) )#set( $void = $extraImports.add($cv) )#end##
|
||||
#end##
|
||||
#end##
|
||||
@@ -0,0 +1,12 @@
|
||||
## =====================================================================
|
||||
## CONVERTER MAPPING LOADER
|
||||
## 외부 설정 파일 'converters.csv' 를 읽어 행 리스트($convRows)로 보관.
|
||||
## 형식(세미콜론 구분): DB컬럼명 ; enum타입FQN ; 컨버터FQN
|
||||
## -> 이 .vm 은 수정 불필요. 매핑은 converters.csv 에서만 관리.
|
||||
## =====================================================================
|
||||
#set( $convFile = $fn.fileFromBundle("converters.csv") )
|
||||
#if( $convFile.exists() )
|
||||
#set( $convRows = $convFile.loadValues(";") )
|
||||
#else
|
||||
#set( $convRows = [] )
|
||||
#end
|
||||
@@ -0,0 +1,9 @@
|
||||
## #set($recordClass = "${entity.name}Record" )
|
||||
## #set($recordInstance = $fn.uncapitalize($entity.name) )
|
||||
##
|
||||
#set($jpaEntityClass = "${entity.name}" )
|
||||
#set($jpaEntityIdClass = "${entity.name}Id" )
|
||||
##
|
||||
## #set($jpaMapperClass = "${entity.name}RecordMapper" )
|
||||
## #set($jpaMapperInstance = "${recordInstance}Mapper" )
|
||||
##
|
||||
@@ -0,0 +1,4 @@
|
||||
/*
|
||||
* Created on $now.date ( $now.time )
|
||||
* Generated by Telosys ( http://www.telosys.org/ ) version $generator.version
|
||||
*/
|
||||
@@ -0,0 +1,12 @@
|
||||
## =====================================================================
|
||||
## TYPE MAPPING LOADER
|
||||
## 외부 설정 파일 'type-mapping.csv' 를 읽어 행 리스트($typeMapRows)로 보관.
|
||||
## 형식(세미콜론 구분): DB컬럼명 ; Java타입(FQN) ; 추가 어노테이션(선택)
|
||||
## -> 이 .vm 은 수정 불필요. 매핑은 type-mapping.csv 에서만 관리.
|
||||
## =====================================================================
|
||||
#set( $typeMapFile = $fn.fileFromBundle("type-mapping.csv") )
|
||||
#if( $typeMapFile.exists() )
|
||||
#set( $typeMapRows = $typeMapFile.loadValues(";") )
|
||||
#else
|
||||
#set( $typeMapRows = [] )
|
||||
#end
|
||||
@@ -0,0 +1,145 @@
|
||||
## --------------------------------------------------
|
||||
## BASE 엔티티 (@MappedSuperclass) — DB에서 매번 재생성 (덮어씀)
|
||||
## + concrete( @Entity )는 "없을 때만" 1회 생성 (있으면 보존)
|
||||
## 경로는 telosys-tools.cfg 의 ENTITY_BASE_PKG / ENTITY_CONCRETE_PKG 로 결정
|
||||
##
|
||||
## CSV 들 (converters.csv, type-mapping.csv) 의 FQN 은 자동으로 짧은 이름
|
||||
## 으로 치환되고, 필요한 import 가 자동 추가됨 (auto_imports.vm 참고).
|
||||
##
|
||||
## Lombok :
|
||||
## @Getter @Setter @SuperBuilder @NoArgsConstructor @AllArgsConstructor
|
||||
## (@Builder 가 아닌 @SuperBuilder — Base/Concrete 상속에서 builder() 가
|
||||
## Concrete 타입으로 동작하도록)
|
||||
##
|
||||
## Swagger : @Schema(description = "DB 컬럼 코멘트") 자동 부착
|
||||
## --------------------------------------------------
|
||||
#if ( $entity.isJoinEntity() )
|
||||
#cancel("No JPA class for join entity")
|
||||
#end
|
||||
#checkId($entity)
|
||||
#parse("include/init_var_entity.vm")
|
||||
#parse("include/java_header.vm")
|
||||
#parse("include/converters_mapping.vm")
|
||||
#parse("include/type_mapping.vm")
|
||||
#parse("include/auto_imports.vm")
|
||||
##---------------------------------------------------------------------------------------
|
||||
#set( $entityClass = "${entity.name}JpaEntity" )
|
||||
#set( $entityBaseClass = "${entity.name}JpaEntityBase" )
|
||||
#set( $basePath = $ENTITY_BASE_PKG.replace(".", "/") )
|
||||
#set( $concretePath = $ENTITY_CONCRETE_PKG.replace(".", "/") )
|
||||
#set( $concreteFolder = "${SRC}/${concretePath}" )
|
||||
#set( $concreteFile = "${concreteFolder}/${entityClass}.java" )
|
||||
#if( ! $fn.file($concreteFile).exists() )
|
||||
$generator.generate($entity.name, "${entityClass}.java", $concreteFolder, "main-java/XxxConcrete_java.vm")
|
||||
#end
|
||||
##---------------------------------------------------------------------------------------
|
||||
package ${ENTITY_BASE_PKG};
|
||||
|
||||
import java.io.Serializable;
|
||||
#foreach( $import in $java.imports($entity) )
|
||||
import $import;
|
||||
#end
|
||||
#foreach( $imp in $extraImports )
|
||||
import $imp;
|
||||
#end
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.persistence.*;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
/**
|
||||
* BASE class for "${entityClass}" — generated from DB, DO NOT EDIT (regenerated).
|
||||
* 비즈니스 로직은 ${ENTITY_CONCRETE_PKG}.${entityClass} 에 작성하세요.
|
||||
#if( $entity.databaseComment && $entity.databaseComment != "" )
|
||||
*
|
||||
* Table comment: ${entity.databaseComment}
|
||||
#end
|
||||
*/
|
||||
#if( $entity.databaseComment && $entity.databaseComment != "" )
|
||||
@Schema(description = "${entity.databaseComment}")
|
||||
#end
|
||||
@MappedSuperclass
|
||||
@Getter
|
||||
@Setter
|
||||
@SuperBuilder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public abstract class ${entityBaseClass} implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
//--- ENTITY PRIMARY KEY
|
||||
#foreach( $attribute in $entity.keyAttributes )
|
||||
#if( $attribute.databaseComment && $attribute.databaseComment != "" )
|
||||
@Schema(description = "${attribute.databaseComment}")
|
||||
#end
|
||||
$jpa.fieldAnnotations(4, $attribute)
|
||||
private $attribute.formattedType(10) $attribute.name #if($attribute.hasInitialValue())= ${attribute.ini} #end;
|
||||
|
||||
#end
|
||||
//--- ENTITY DATA FIELDS
|
||||
#foreach( $attribute in $entity.nonKeyAttributes )
|
||||
## ---- 1) type-mapping.csv 우선 매칭
|
||||
#set( $mapType = false )
|
||||
#set( $mapAnno = false )
|
||||
#foreach( $row in $typeMapRows )
|
||||
#if( $row.size() >= 2 && $row.get(0).trim().equals($attribute.databaseName) )
|
||||
#set( $mapType = $row.get(1).trim() )
|
||||
#if( $row.size() >= 3 )
|
||||
#set( $mapAnno = $row.get(2).trim() )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
## ---- 2) converters.csv 매칭 (type-mapping 매칭 없을 때만)
|
||||
#set( $convType = false )
|
||||
#set( $convClass = false )
|
||||
#if( !$mapType )
|
||||
#if( $attribute.hasTag("converter") )
|
||||
#set( $convType = $attribute.tagValue("javaType") )
|
||||
#set( $convClass = $attribute.tagValue("converter") )
|
||||
#else
|
||||
#foreach( $row in $convRows )
|
||||
#if( $row.size() >= 3 && $row.get(0).trim().equals($attribute.databaseName) )
|
||||
#set( $convType = $row.get(1).trim() )
|
||||
#set( $convClass = $row.get(2).trim() )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
## ---- 3) FQN → 짧은 이름 치환
|
||||
#set( $dispType = false )
|
||||
#set( $dispAnno = false )
|
||||
#set( $dispConv = false )
|
||||
#if( $mapType )#set( $dispType = $mapType )#end
|
||||
#if( $mapAnno )#set( $dispAnno = $mapAnno )#end
|
||||
#if( $convType )#set( $dispType = $convType )#end
|
||||
#if( $convClass )#set( $dispConv = $convClass )#end
|
||||
#foreach( $imp in $extraImports )
|
||||
#set( $tail = $imp.substring($imp.lastIndexOf(".")) )
|
||||
#set( $sn = $tail.substring(1) )
|
||||
#if( $dispType )#set( $dispType = $dispType.replace($imp, $sn) )#end
|
||||
#if( $dispAnno )#set( $dispAnno = $dispAnno.replace($imp, $sn) )#end
|
||||
#if( $dispConv )#set( $dispConv = $dispConv.replace($imp, $sn) )#end
|
||||
#end
|
||||
## ---- 4) 필드 출력
|
||||
#if( $attribute.databaseComment && $attribute.databaseComment != "" )
|
||||
@Schema(description = "${attribute.databaseComment}")
|
||||
#end
|
||||
#if( $dispAnno && $dispAnno != "" )
|
||||
${dispAnno}
|
||||
#end
|
||||
#if( $dispConv )
|
||||
@Convert(converter = ${dispConv}.class)
|
||||
#end
|
||||
$jpa.fieldAnnotations(4, $attribute)
|
||||
#if( $dispType )
|
||||
private ${dispType} $attribute.name ;
|
||||
#else
|
||||
private $attribute.formattedType(10) $attribute.name #if($attribute.hasInitialValue())= ${attribute.ini} #end;
|
||||
#end
|
||||
|
||||
#end
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
## --------------------------------------------------
|
||||
## CONCRETE 엔티티 (@Entity) — "없을 때만" 1회 생성. 재생성해도 보존됨.
|
||||
## 여기에 커스텀 비즈니스 로직을 추가하세요.
|
||||
## 경로 : telosys-tools.cfg 의 ENTITY_CONCRETE_PKG
|
||||
##
|
||||
## @SuperBuilder : Base 의 모든 필드를 포함한 builder() 가 Concrete 타입을
|
||||
## 반환하도록 함. @NoArgsConstructor 는 JPA proxy 생성용.
|
||||
## --------------------------------------------------
|
||||
#parse("include/init_var_entity.vm")
|
||||
#set( $entityClass = "${entity.name}JpaEntity" )
|
||||
#set( $entityBaseClass = "${entity.name}JpaEntityBase" )
|
||||
package ${ENTITY_CONCRETE_PKG};
|
||||
|
||||
import ${ENTITY_BASE_PKG}.${entityBaseClass};
|
||||
import jakarta.persistence.*;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
@Entity
|
||||
@Table(name="${entity.databaseTable}"#if($entity.databaseCatalog && $entity.databaseCatalog != ""), catalog="${entity.databaseCatalog}"#end)
|
||||
@SuperBuilder
|
||||
@NoArgsConstructor
|
||||
public class ${entityClass} extends ${entityBaseClass} {
|
||||
|
||||
// ================= 커스텀 영역 (재생성해도 보존) =================
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
#---------------------------------------------------------
|
||||
# Bundle configuration : label ; generated file ; target folder ; template ; once-flag(1)
|
||||
#---------------------------------------------------------
|
||||
#
|
||||
# Base/Concrete (상속) 구조로 생성됩니다 :
|
||||
# - <Entity>Base.java : @MappedSuperclass, DB 와 항상 1:1 (매번 재생성, 수정 금지)
|
||||
# 위치: telosys-tools.cfg 의 ENTITY_BASE_PKG
|
||||
# - <Entity>.java : @Entity extends Base, 커스텀 영역 (없을 때만 1회 생성, 보존)
|
||||
# 위치: telosys-tools.cfg 의 ENTITY_CONCRETE_PKG
|
||||
# ↑ Base 템플릿이 내부에서 자동 생성하므로 여기엔 Base 만 등록.
|
||||
#
|
||||
# 컬럼 -> enum/@Convert 매핑은 converters.csv 가 결정.
|
||||
# 컬럼 코멘트(DB column comment)는 자동으로 /** ... */ Javadoc 으로 삽입됩니다.
|
||||
#---------------------------------------------------------
|
||||
|
||||
Base (MappedSuperclass) ; ${ENT}JpaEntityBase.java ; ${SRC}/${ENTITY_BASE_PKG} ; main-java/XxxBase_java.vm ; *
|
||||
@@ -0,0 +1,15 @@
|
||||
# =====================================================================
|
||||
# TYPE MAPPING (converter 가 아닌 커스텀 타입 매핑)
|
||||
# 형식(세미콜론 구분) : DB컬럼명 ; Java타입(FQN) ; 추가 어노테이션(선택)
|
||||
#
|
||||
# - converter 가 아니라 Hibernate @JdbcTypeCode / @Type / 사용자 정의 UserType 등
|
||||
# "필드 타입 자체를 바꾸고 특수 어노테이션을 같이 붙여야 하는" 케이스용.
|
||||
# - 같은 컬럼명을 가진 모든 엔티티에 자동 적용됨.
|
||||
# - converters.csv 와 매칭이 겹치면 → 이 파일이 우선.
|
||||
# - 새 커스텀 타입이 생기면 이 파일에 한 줄만 추가. 템플릿/엔티티 수정 불필요.
|
||||
# - 추가 어노테이션은 FQN 으로 작성 (import 자동 추가 안 됨).
|
||||
# - 어노테이션이 필요 없으면 세 번째 칸을 비워둘 수 있음.
|
||||
# =====================================================================
|
||||
|
||||
# ---- JSON 컬럼 ---------------------------------------------------------
|
||||
tag_ids ; java.util.List<Integer> ; @org.hibernate.annotations.JdbcTypeCode(org.hibernate.type.SqlTypes.JSON)
|
||||
|
Can't render this file because it contains an unexpected character in line 6 and column 6.
|
@@ -0,0 +1,26 @@
|
||||
## --------------------------------------------------
|
||||
## 공통 변수 초기화 (Repository 템플릿용)
|
||||
## --------------------------------------------------
|
||||
#set( $entityName = $entity.name )
|
||||
#set( $entityClass = "${entity.name}JpaEntity" )
|
||||
#set( $repoBaseClass = "${entity.name}JpaRepositoryBase" )
|
||||
#set( $repoConcreteClass = "${entity.name}JpaRepository" )
|
||||
##
|
||||
## PK 타입 추출 (단일 키 가정; 복합키는 별도 처리 필요)
|
||||
## primitive 는 wrapper 로 변환 (제네릭 인자에 사용)
|
||||
#set( $pkType = "Long" )
|
||||
#foreach( $a in $entity.keyAttributes )
|
||||
#if( $a.hasTag("javaType") )
|
||||
#set( $pkType = $a.tagValue("javaType") )
|
||||
#else
|
||||
#set( $pkType = $a.type )
|
||||
#end
|
||||
#end
|
||||
#if( $pkType == "int" )#set( $pkType = "Integer" )#end
|
||||
#if( $pkType == "long" )#set( $pkType = "Long" )#end
|
||||
#if( $pkType == "short" )#set( $pkType = "Short" )#end
|
||||
#if( $pkType == "byte" )#set( $pkType = "Byte" )#end
|
||||
#if( $pkType == "boolean" )#set( $pkType = "Boolean" )#end
|
||||
#if( $pkType == "char" )#set( $pkType = "Character" )#end
|
||||
#if( $pkType == "float" )#set( $pkType = "Float" )#end
|
||||
#if( $pkType == "double" )#set( $pkType = "Double" )#end
|
||||
@@ -0,0 +1,4 @@
|
||||
/*
|
||||
* Created on $now.date ( $now.time )
|
||||
* Generated by Telosys ( http://www.telosys.org/ ) version $generator.version
|
||||
*/
|
||||
@@ -0,0 +1,59 @@
|
||||
## --------------------------------------------------
|
||||
## BASE Repository (@NoRepositoryBean) — DB 와 1:1, 매번 재생성 (덮어씀)
|
||||
## + Concrete( @Repository )는 "없을 때만" 1회 생성 (있으면 보존)
|
||||
## 경로는 telosys-tools.cfg 의 REPO_BASE_PKG / REPO_CONCRETE_PKG / ENTITY_CONCRETE_PKG 로 결정
|
||||
## --------------------------------------------------
|
||||
#if ( $entity.isJoinEntity() )
|
||||
#cancel("No JPA repository for join entity")
|
||||
#end
|
||||
#checkId($entity)
|
||||
#parse("include/init_var_repo.vm")
|
||||
#parse("include/java_header.vm")
|
||||
##---------------------------------------------------------------------------------------
|
||||
## 경로 계산 : 모두 telosys-tools.cfg 의 변수 기반
|
||||
## Base -> REPO_BASE_PKG
|
||||
## Concrete -> REPO_CONCRETE_PKG (없으면 1회 생성)
|
||||
##---------------------------------------------------------------------------------------
|
||||
#set( $concretePath = $REPO_CONCRETE_PKG.replace(".", "/") )
|
||||
#set( $concreteFolder = "${SRC}/${concretePath}" )
|
||||
#set( $concreteFile = "${concreteFolder}/${repoConcreteClass}.java" )
|
||||
#if( ! $fn.file($concreteFile).exists() )
|
||||
$generator.generate($entity.name, "${repoConcreteClass}.java", $concreteFolder, "main-java/XxxRepositoryConcrete_java.vm")
|
||||
#end
|
||||
##---------------------------------------------------------------------------------------
|
||||
package ${REPO_BASE_PKG};
|
||||
|
||||
import ${ENTITY_CONCRETE_PKG}.${entityClass};
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
import org.springframework.data.repository.NoRepositoryBean;
|
||||
|
||||
/**
|
||||
* BASE repository for "${entityClass}" — generated from DB, DO NOT EDIT (regenerated).
|
||||
* 커스텀 쿼리는 ${REPO_CONCRETE_PKG}.${repoConcreteClass} 에 작성하세요.
|
||||
#if( $entity.databaseComment && $entity.databaseComment != "" )
|
||||
*
|
||||
* Table comment: ${entity.databaseComment}
|
||||
#end
|
||||
*
|
||||
* <p>주요 컬럼:</p>
|
||||
* <ul>
|
||||
#foreach( $attribute in $entity.keyAttributes )
|
||||
#if( $attribute.databaseComment && $attribute.databaseComment != "" )
|
||||
* <li>(PK) ${attribute.databaseName} — ${attribute.databaseComment}</li>
|
||||
#else
|
||||
* <li>(PK) ${attribute.databaseName}</li>
|
||||
#end
|
||||
#end
|
||||
#foreach( $attribute in $entity.nonKeyAttributes )
|
||||
#if( $attribute.databaseComment && $attribute.databaseComment != "" )
|
||||
* <li>${attribute.databaseName} — ${attribute.databaseComment}</li>
|
||||
#end
|
||||
#end
|
||||
* </ul>
|
||||
*/
|
||||
@NoRepositoryBean
|
||||
public interface ${repoBaseClass} extends JpaRepository<${entityClass}, ${pkType}>,
|
||||
JpaSpecificationExecutor<${entityClass}> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
## --------------------------------------------------
|
||||
## CONCRETE Repository (@Repository) — "없을 때만" 1회 생성. 재생성해도 보존됨.
|
||||
## 여기에 커스텀 쿼리 / 메소드를 추가하세요.
|
||||
## 경로 : telosys-tools.cfg 의 REPO_CONCRETE_PKG
|
||||
## --------------------------------------------------
|
||||
#parse("include/init_var_repo.vm")
|
||||
package ${REPO_CONCRETE_PKG};
|
||||
|
||||
import ${REPO_BASE_PKG}.${repoBaseClass};
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface ${repoConcreteClass} extends ${repoBaseClass} {
|
||||
|
||||
// ================= 커스텀 쿼리 영역 (재생성해도 보존) =================
|
||||
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#---------------------------------------------------------
|
||||
# Bundle configuration : label ; generated file ; target folder ; template ; once-flag(1)
|
||||
#---------------------------------------------------------
|
||||
#
|
||||
# Base/Concrete (인터페이스 상속) 구조로 생성됩니다 :
|
||||
# - <Entity>JpaRepositoryBase.java
|
||||
# @NoRepositoryBean
|
||||
# interface XxxJpaRepositoryBase extends JpaRepository<Entity, PK>, JpaSpecificationExecutor<Entity>
|
||||
# DB 와 1:1, 매번 재생성, 수정 금지
|
||||
# 위치: telosys-tools.cfg 의 REPO_BASE_PKG
|
||||
#
|
||||
# - <Entity>JpaRepository.java
|
||||
# @Repository
|
||||
# interface XxxJpaRepository extends XxxJpaRepositoryBase
|
||||
# 커스텀 쿼리/메소드를 여기에 추가 (없을 때만 1회 생성, 보존)
|
||||
# 위치: telosys-tools.cfg 의 REPO_CONCRETE_PKG
|
||||
# ↑ Base 템플릿이 내부에서 자동 생성하므로 여기엔 Base 만 등록.
|
||||
#
|
||||
# 엔티티 Concrete 위치(ENTITY_CONCRETE_PKG)를 import 합니다.
|
||||
#---------------------------------------------------------
|
||||
|
||||
Base (RepositoryBase) ; ${ENT}JpaRepositoryBase.java ; ${SRC}/${REPO_BASE_PKG} ; main-java/XxxRepositoryBase_java.vm ; *
|
||||
Reference in New Issue
Block a user