Model generator

This commit is contained in:
2026-05-15 13:14:54 +02:00
parent 8905773132
commit d7a3547fbf
9 changed files with 25 additions and 126 deletions

View File

@@ -27,12 +27,6 @@ public class IntervalsActivityService extends AbstractService<IntervalsActivity,
return intervalsActivityDAO;
}
@Override
@Transactional
public IntervalsActivity getById(final long id) {
return super.getById(id);
}
@Transactional
public @Nullable IntervalsActivity getEarliestActivity(final Long athleteId) {
return intervalsActivityDAO.getEarliestActivity(athleteId);
@@ -86,18 +80,6 @@ public class IntervalsActivityService extends AbstractService<IntervalsActivity,
return intervalsActivityDAO.findPendingStreamIds(athleteId);
}
@Override
@Transactional
public void insert(final IntervalsActivity activity) {
super.insert(activity);
}
@Override
@Transactional
public void update(final IntervalsActivity activity) {
super.update(activity);
}
@Transactional
public IntervalsActivity linkWorkout(final long activityId, final long workoutId) {
final IntervalsActivity activity = intervalsActivityDAO.getById(activityId);

View File

@@ -30,9 +30,4 @@ public class StravaActivityService extends AbstractService<StravaActivity, Strav
return stravaActivityDAO.getLatestActivity(athleteId);
}
@Override
@Transactional
public void insert(final StravaActivity activity) {
super.insert(activity);
}
}

View File

@@ -20,12 +20,6 @@ public class AthleteService extends AbstractService<Athlete, AthleteDAO> {
return athleteDAO;
}
@Override
@Transactional
public Athlete getById(final long id) {
return super.getById(id);
}
@Transactional
public @Nullable Athlete getByLogin(final String login) {
return athleteDAO.findByLogin(login);

View File

@@ -2,29 +2,35 @@ package com.peakup.common.service;
import com.peakup.common.dao.AbstractDAO;
import com.peakup.common.model.AbstractEntity;
import jakarta.transaction.Transactional;
import java.util.List;
@SuppressWarnings("unused")
public abstract class AbstractService<E extends AbstractEntity, D extends AbstractDAO<E>> {
protected E getById(final long id) {
@Transactional
public final E getById(final long id) {
return getDAO().getById(id);
}
protected List<E> getAll() {
@Transactional
public final List<E> getAll() {
return getDAO().getAll();
}
protected void insert(final E entity) {
@Transactional
public final void insert(final E entity) {
getDAO().insert(entity);
}
protected void update(final E entity) {
@Transactional
public final void update(final E entity) {
getDAO().update(entity);
}
protected void delete(final E entity) {
@Transactional
public final void delete(final E entity) {
getDAO().delete(entity);
}

View File

@@ -24,24 +24,6 @@ public class GoalService extends AbstractService<Goal, GoalDAO> {
return goalDAO;
}
@Override
@Transactional
public Goal getById(final long id) {
return super.getById(id);
}
@Override
@Transactional
public void insert(final Goal goal) {
super.insert(goal);
}
@Override
@Transactional
public void delete(final Goal goal) {
super.delete(goal);
}
@Transactional
public List<Goal> getByAthleteId(final Long athleteId) {
return goalDAO.getByAthleteId(athleteId);

View File

@@ -49,12 +49,6 @@ public class WeekPlanService extends AbstractService<WeekPlan, WeekPlanDAO> {
return weekPlanDAO;
}
@Override
@Transactional
public WeekPlan getById(final long id) {
return super.getById(id);
}
@Transactional
public WeekPlan getByIdWithWorkouts(final long id) {
final WeekPlan weekPlan = super.getById(id);
@@ -130,12 +124,6 @@ public class WeekPlanService extends AbstractService<WeekPlan, WeekPlanDAO> {
}
}
@Override
@Transactional
public void delete(final WeekPlan entity) {
super.delete(entity);
}
public String generateImportSchema() {
final JakartaValidationModule validationModule = new JakartaValidationModule(
JakartaValidationOption.NOT_NULLABLE_FIELD_IS_REQUIRED,

View File

@@ -20,12 +20,6 @@ public class WorkoutService extends AbstractService<Workout, WorkoutDAO> {
return workoutDAO;
}
@Override
@Transactional
public Workout getById(final long id) {
return super.getById(id);
}
@Transactional
public @Nullable Workout updateWorkout(final long planId, final long workoutId, final Workout updated) {
final Workout existing = workoutDAO.getById(workoutId);

View File

@@ -52,7 +52,9 @@ public class ModelGeneratorTool {
? Paths.get(args[1])
: Paths.get(System.getProperty("user.dir")).resolve("peakup-backend/src/main/java");
final ModelDefinition def = new ObjectMapper().readValue(definitionPath.toFile(), ModelDefinition.class);
final ModelDefinition def = new ObjectMapper()
.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.readValue(definitionPath.toFile(), ModelDefinition.class);
System.out.println("Generating: " + def.modelName + " → " + outputDir.toAbsolutePath());
@@ -100,7 +102,7 @@ public class ModelGeneratorTool {
enumBuilder.addField(FieldSpec.builder(TypeName.INT, "key", Modifier.PRIVATE, Modifier.FINAL).build());
enumBuilder.addMethod(MethodSpec.constructorBuilder()
.addParameter(TypeName.INT, "key")
.addParameter(ParameterSpec.builder(TypeName.INT, "key").addModifiers(Modifier.FINAL).build())
.addStatement("this.key = key")
.build());
@@ -128,7 +130,7 @@ public class ModelGeneratorTool {
enumBuilder.addType(converterClass);
return JavaFile.builder(modelPackage, enumBuilder.build()).skipJavaLangImports(true).build();
return JavaFile.builder(modelPackage, enumBuilder.build()).indent(" ").skipJavaLangImports(true).build();
}
// -----------------------------------------------------------------------
@@ -147,7 +149,7 @@ public class ModelGeneratorTool {
classBuilder.addMethod(buildHibernateConstructor());
return JavaFile.builder(modelPackage, classBuilder.build()).skipJavaLangImports(true).build();
return JavaFile.builder(modelPackage, classBuilder.build()).indent(" ").skipJavaLangImports(true).build();
}
// -----------------------------------------------------------------------
@@ -186,7 +188,7 @@ public class ModelGeneratorTool {
classBuilder.addMethod(buildMergeFromMethod(def, modelClass));
classBuilder.addMethod(buildHibernateConstructor());
return JavaFile.builder(modelPackage, classBuilder.build()).skipJavaLangImports(true).build();
return JavaFile.builder(modelPackage, classBuilder.build()).indent(" ").skipJavaLangImports(true).build();
}
private void addElementCollectionFields(final TypeSpec.Builder classBuilder,
@@ -290,7 +292,7 @@ public class ModelGeneratorTool {
classBuilder.addMethod(buildGetByAthleteIdDAO(modelClass));
}
return JavaFile.builder(daoPackage, classBuilder.build()).skipJavaLangImports(true).build();
return JavaFile.builder(daoPackage, classBuilder.build()).indent(" ").skipJavaLangImports(true).build();
}
private MethodSpec buildGetByAthleteIdDAO(final ClassName modelClass) {
@@ -319,9 +321,7 @@ public class ModelGeneratorTool {
final String servicePackage = def.packageBase + ".service";
final ClassName modelClass = ClassName.get(modelPackage, def.modelName);
final ClassName daoClass = ClassName.get(daoPackage, def.modelName + "DAO");
final ClassName transactional = ClassName.get("jakarta.transaction", "Transactional");
final String daoFieldName = toLowerFirst(def.modelName) + "DAO";
final String entityParam = toLowerFirst(def.modelName);
final TypeSpec.Builder classBuilder = TypeSpec.classBuilder(def.modelName + "Service")
.addModifiers(Modifier.PUBLIC)
@@ -341,53 +341,9 @@ public class ModelGeneratorTool {
.addStatement("return $L", daoFieldName)
.build());
classBuilder.addMethod(MethodSpec.methodBuilder("getById")
.addAnnotation(Override.class)
.addAnnotation(transactional)
.addModifiers(Modifier.PUBLIC)
.returns(modelClass)
.addParameter(ParameterSpec.builder(TypeName.LONG, "id").addModifiers(Modifier.FINAL).build())
.addStatement("return super.getById(id)")
.build());
classBuilder.addMethod(MethodSpec.methodBuilder("getAll")
.addAnnotation(Override.class)
.addAnnotation(transactional)
.addModifiers(Modifier.PUBLIC)
.returns(ParameterizedTypeName.get(ClassName.get(List.class), modelClass))
.addStatement("return super.getAll()")
.build());
classBuilder.addMethod(MethodSpec.methodBuilder("insert")
.addAnnotation(Override.class)
.addAnnotation(transactional)
.addModifiers(Modifier.PUBLIC)
.addParameter(ParameterSpec.builder(modelClass, entityParam).addModifiers(Modifier.FINAL).build())
.returns(TypeName.VOID)
.addStatement("super.insert($L)", entityParam)
.build());
classBuilder.addMethod(MethodSpec.methodBuilder("update")
.addAnnotation(Override.class)
.addAnnotation(transactional)
.addModifiers(Modifier.PUBLIC)
.addParameter(ParameterSpec.builder(modelClass, entityParam).addModifiers(Modifier.FINAL).build())
.returns(TypeName.VOID)
.addStatement("super.update($L)", entityParam)
.build());
classBuilder.addMethod(MethodSpec.methodBuilder("delete")
.addAnnotation(Override.class)
.addAnnotation(transactional)
.addModifiers(Modifier.PUBLIC)
.addParameter(ParameterSpec.builder(modelClass, entityParam).addModifiers(Modifier.FINAL).build())
.returns(TypeName.VOID)
.addStatement("super.delete($L)", entityParam)
.build());
if (hasAthleteId(def)) {
classBuilder.addMethod(MethodSpec.methodBuilder("getByAthleteId")
.addAnnotation(transactional)
.addAnnotation(ClassName.get("jakarta.transaction", "Transactional"))
.addModifiers(Modifier.PUBLIC)
.returns(ParameterizedTypeName.get(ClassName.get(List.class), modelClass))
.addParameter(ParameterSpec.builder(TypeName.LONG, "athleteId").addModifiers(Modifier.FINAL).build())
@@ -395,7 +351,7 @@ public class ModelGeneratorTool {
.build());
}
return JavaFile.builder(servicePackage, classBuilder.build()).skipJavaLangImports(true).build();
return JavaFile.builder(servicePackage, classBuilder.build()).indent(" ").skipJavaLangImports(true).build();
}
// -----------------------------------------------------------------------
@@ -440,7 +396,7 @@ public class ModelGeneratorTool {
classBuilder.addMethod(buildUpdateEndpoint(modelClass, serviceFieldName, entityParam, restResponse, noResultException));
classBuilder.addMethod(buildDeleteEndpoint(modelClass, serviceFieldName, restResponse, noResultException));
return JavaFile.builder(def.packageBase, classBuilder.build()).skipJavaLangImports(true).build();
return JavaFile.builder(def.packageBase, classBuilder.build()).indent(" ").skipJavaLangImports(true).build();
}
private void addGetEndpoint(final TypeSpec.Builder classBuilder, final ModelDefinition def,

View File

@@ -1,4 +1,5 @@
{
"_comment": "Example model definition for ModelGeneratorTool. Adjust and copy to define your own model.",
"modelName": "TrainingNote",
"packageBase": "com.peakup.trainingnote",
"tableName": "training_note",
@@ -38,10 +39,11 @@
}
}
],
"_oneToManyRelations_note": "entityClass can be a simple name (resolved to packageBase.model) or a fully-qualified class name.",
"oneToManyRelations": [
{
"fieldName": "steps",
"entityClass": "NoteStep",
"entityClass": "com.peakup.workout.model.WorkoutStep",
"joinColumn": "training_note_id",
"orderBy": "sortIndex ASC",
"fetchMode": "SUBSELECT"