diff --git a/pom.xml b/pom.xml
index 8b96e22..4ae925f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -32,14 +32,6 @@
fenix-spring-boot-starter
3.1.0
-
-
- com.querydsl
- querydsl-apt
- ${querydsl.version}
- provided
- jakarta
-
com.querydsl
querydsl-jpa
@@ -47,6 +39,11 @@
jakarta
+
+ org.projectlombok
+ lombok
+
+
com.h2database
h2
@@ -90,33 +87,33 @@
- com.mysema.maven
- apt-maven-plugin
- 1.1.3
-
-
- compile-dsl
- compile
-
- process
-
-
- com.querydsl.apt.jpa.JPAAnnotationProcessor
- target/generated-sources/java
-
-
-
- test-compile-dsl
- test-compile
-
- test-process
-
-
- com.querydsl.apt.jpa.JPAAnnotationProcessor
- target/generated-test-sources/java
-
-
-
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.14.0
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.36
+
+
+ com.querydsl
+ querydsl-apt
+ ${querydsl.version}
+ jakarta
+
+
+ jakarta.persistence
+ jakarta.persistence-api
+ 3.2.0
+
+
+
+ -Aquerydsl.entityAccessors=true
+ -Aquerydsl.createDefaultVariable=true
+
+
diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java b/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java
index 1468bd5..2fbc78d 100644
--- a/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java
+++ b/src/main/java/com/lanyuanxiaoyao/service/template/controller/Query.java
@@ -2,45 +2,21 @@ package com.lanyuanxiaoyao.service.template.controller;
import java.util.List;
import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+@Setter
+@Getter
+@ToString
public class Query {
private Queryable query;
private List sort;
private Pageable page;
- public Queryable getQuery() {
- return query;
- }
-
- public void setQuery(Queryable query) {
- this.query = query;
- }
-
- public List getSort() {
- return sort;
- }
-
- public void setSort(List sort) {
- this.sort = sort;
- }
-
- public Pageable getPage() {
- return page;
- }
-
- public void setPage(Pageable page) {
- this.page = page;
- }
-
- @Override
- public String toString() {
- return "Query{" +
- "query=" + query +
- ", sort=" + sort +
- ", page=" + page +
- '}';
- }
-
+ @Setter
+ @Getter
+ @ToString
public static class Queryable {
private List nullEqual;
private List notNullEqual;
@@ -59,246 +35,33 @@ public class Query {
private Map between;
private Map notBetween;
- public List getNullEqual() {
- return nullEqual;
- }
-
- public void setNullEqual(List nullEqual) {
- this.nullEqual = nullEqual;
- }
-
- public List getNotNullEqual() {
- return notNullEqual;
- }
-
- public void setNotNullEqual(List notNullEqual) {
- this.notNullEqual = notNullEqual;
- }
-
- public List getEmpty() {
- return empty;
- }
-
- public void setEmpty(List empty) {
- this.empty = empty;
- }
-
- public List getNotEmpty() {
- return notEmpty;
- }
-
- public void setNotEmpty(List notEmpty) {
- this.notEmpty = notEmpty;
- }
-
- public Map getEqual() {
- return equal;
- }
-
- public void setEqual(Map equal) {
- this.equal = equal;
- }
-
- public Map getNotEqual() {
- return notEqual;
- }
-
- public void setNotEqual(Map notEqual) {
- this.notEqual = notEqual;
- }
-
- public Map getLike() {
- return like;
- }
-
- public void setLike(Map like) {
- this.like = like;
- }
-
- public Map getNotLike() {
- return notLike;
- }
-
- public void setNotLike(Map notLike) {
- this.notLike = notLike;
- }
-
- public Map getGreat() {
- return great;
- }
-
- public void setGreat(Map great) {
- this.great = great;
- }
-
- public Map getLess() {
- return less;
- }
-
- public void setLess(Map less) {
- this.less = less;
- }
-
- public Map getGreatEqual() {
- return greatEqual;
- }
-
- public void setGreatEqual(Map greatEqual) {
- this.greatEqual = greatEqual;
- }
-
- public Map getLessEqual() {
- return lessEqual;
- }
-
- public void setLessEqual(Map lessEqual) {
- this.lessEqual = lessEqual;
- }
-
- public Map> getIn() {
- return in;
- }
-
- public void setIn(Map> in) {
- this.in = in;
- }
-
- public Map> getNotIn() {
- return notIn;
- }
-
- public void setNotIn(Map> notIn) {
- this.notIn = notIn;
- }
-
- public Map getBetween() {
- return between;
- }
-
- public void setBetween(Map between) {
- this.between = between;
- }
-
- public Map getNotBetween() {
- return notBetween;
- }
-
- public void setNotBetween(Map notBetween) {
- this.notBetween = notBetween;
- }
-
- @Override
- public String toString() {
- return "Queryable{" +
- "nullEqual=" + nullEqual +
- ", notNullEqual=" + notNullEqual +
- ", empty=" + empty +
- ", notEmpty=" + notEmpty +
- ", equal=" + equal +
- ", notEqual=" + notEqual +
- ", like=" + like +
- ", notLike=" + notLike +
- ", great=" + great +
- ", less=" + less +
- ", greatEqual=" + greatEqual +
- ", lessEqual=" + lessEqual +
- ", in=" + in +
- ", notIn=" + notIn +
- ", between=" + between +
- ", notBetween=" + notBetween +
- '}';
- }
-
+ @Setter
+ @Getter
+ @ToString
public static class Between {
private Object start;
private Object end;
-
- public Object getStart() {
- return start;
- }
-
- public void setStart(Object start) {
- this.start = start;
- }
-
- public Object getEnd() {
- return end;
- }
-
- public void setEnd(Object end) {
- this.end = end;
- }
-
- @Override
- public String toString() {
- return "Between{" +
- "start='" + start + '\'' +
- ", end='" + end + '\'' +
- '}';
- }
}
}
+ @Setter
+ @Getter
+ @ToString
public static class Sortable {
private String column;
private Direction direction;
- public String getColumn() {
- return column;
- }
-
- public void setColumn(String column) {
- this.column = column;
- }
-
- public Direction getDirection() {
- return direction;
- }
-
- public void setDirection(Direction direction) {
- this.direction = direction;
- }
-
- @Override
- public String toString() {
- return "Sortable{" +
- "column='" + column + '\'' +
- ", direction=" + direction +
- '}';
- }
-
public enum Direction {
ASC,
DESC,
}
}
+ @Setter
+ @Getter
+ @ToString
public static class Pageable {
private Integer index;
private Integer size;
-
- public Integer getIndex() {
- return index;
- }
-
- public void setIndex(Integer index) {
- this.index = index;
- }
-
- public Integer getSize() {
- return size;
- }
-
- public void setSize(Integer size) {
- this.size = size;
- }
-
- @Override
- public String toString() {
- return "Pageable{" +
- "index=" + index +
- ", size=" + size +
- '}';
- }
}
}
diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java b/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java
index 77dc4a1..ec09fc5 100644
--- a/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java
+++ b/src/main/java/com/lanyuanxiaoyao/service/template/controller/SimpleControllerSupport.java
@@ -6,11 +6,13 @@ import com.lanyuanxiaoyao.service.template.entity.SimpleEntity;
import com.lanyuanxiaoyao.service.template.helper.ObjectHelper;
import com.lanyuanxiaoyao.service.template.service.SimpleServiceSupport;
import java.util.List;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
+@Slf4j
public abstract class SimpleControllerSupport implements SimpleController {
protected final SimpleServiceSupport service;
diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/controller/response/GlobalResponse.java b/src/main/java/com/lanyuanxiaoyao/service/template/controller/response/GlobalResponse.java
index 26bf039..e7bef4e 100644
--- a/src/main/java/com/lanyuanxiaoyao/service/template/controller/response/GlobalResponse.java
+++ b/src/main/java/com/lanyuanxiaoyao/service/template/controller/response/GlobalResponse.java
@@ -1,7 +1,13 @@
package com.lanyuanxiaoyao.service.template.controller.response;
import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+@Setter
+@Getter
+@ToString
public class GlobalResponse {
private static final int SUCCESS_STATUS = 0;
private static final int ERROR_STATUS = 500;
@@ -96,37 +102,4 @@ public class GlobalResponse {
response.setDetail(detail);
return response;
}
-
- public Integer getStatus() {
- return status;
- }
-
- public void setStatus(Integer status) {
- this.status = status;
- }
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
- public T getData() {
- return data;
- }
-
- public void setData(T data) {
- this.data = data;
- }
-
- @Override
- public String toString() {
- return "AmisResponse{" +
- "status=" + status +
- ", message='" + message + '\'' +
- ", data=" + data +
- '}';
- }
}
diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/entity/IdOnlyEntity.java b/src/main/java/com/lanyuanxiaoyao/service/template/entity/IdOnlyEntity.java
index 328bf26..020657b 100644
--- a/src/main/java/com/lanyuanxiaoyao/service/template/entity/IdOnlyEntity.java
+++ b/src/main/java/com/lanyuanxiaoyao/service/template/entity/IdOnlyEntity.java
@@ -4,9 +4,15 @@ import com.blinkfox.fenix.id.SnowflakeId;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
import org.hibernate.annotations.Comment;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+@Getter
+@Setter
+@ToString
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class IdOnlyEntity {
@@ -14,19 +20,4 @@ public class IdOnlyEntity {
@SnowflakeId
@Comment("记录唯一标记")
private Long id;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @Override
- public String toString() {
- return "IdOnlyEntity{" +
- "id=" + id +
- '}';
- }
}
diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/entity/SimpleEntity.java b/src/main/java/com/lanyuanxiaoyao/service/template/entity/SimpleEntity.java
index a12e1e3..0a31a44 100644
--- a/src/main/java/com/lanyuanxiaoyao/service/template/entity/SimpleEntity.java
+++ b/src/main/java/com/lanyuanxiaoyao/service/template/entity/SimpleEntity.java
@@ -3,11 +3,17 @@ package com.lanyuanxiaoyao.service.template.entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
import org.hibernate.annotations.Comment;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+@Getter
+@Setter
+@ToString(callSuper = true)
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class SimpleEntity extends IdOnlyEntity {
@@ -17,28 +23,4 @@ public class SimpleEntity extends IdOnlyEntity {
@LastModifiedDate
@Comment("记录更新时间")
private LocalDateTime modifiedTime;
-
- public LocalDateTime getCreatedTime() {
- return createdTime;
- }
-
- public void setCreatedTime(LocalDateTime createdTime) {
- this.createdTime = createdTime;
- }
-
- public LocalDateTime getModifiedTime() {
- return modifiedTime;
- }
-
- public void setModifiedTime(LocalDateTime modifiedTime) {
- this.modifiedTime = modifiedTime;
- }
-
- @Override
- public String toString() {
- return "SimpleEntity{" +
- "createdTime=" + createdTime +
- ", modifiedTime=" + modifiedTime +
- "} " + super.toString();
- }
}
diff --git a/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java b/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java
index 0516b2c..5803e82 100644
--- a/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java
+++ b/src/main/java/com/lanyuanxiaoyao/service/template/service/SimpleServiceSupport.java
@@ -15,15 +15,13 @@ import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
+@Slf4j
public abstract class SimpleServiceSupport implements SimpleService {
- private static final Logger log = LoggerFactory.getLogger(SimpleServiceSupport.class);
private static final Integer DEFAULT_PAGE_INDEX = 1;
private static final Integer DEFAULT_PAGE_SIZE = 10;
protected final SimpleRepository repository;
@@ -35,13 +33,7 @@ public abstract class SimpleServiceSupport implemen
@Transactional(rollbackOn = Throwable.class)
@Override
public Long save(ENTITY entity) {
- if (ObjectHelper.isNotNull(entity.getId())) {
- var id = entity.getId();
- var targetEntity = repository.findById(entity.getId()).orElseThrow(() -> new IdNotFoundException(id));
- BeanUtils.copyProperties(entity, targetEntity, "id", "createdTime", "modifiedTime");
- entity = targetEntity;
- }
- entity = repository.save(entity);
+ entity = repository.saveOrUpdateByNotNullProperties(entity);
return entity.getId();
}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java
index 5595537..84da087 100644
--- a/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/TestApplication.java
@@ -111,6 +111,19 @@ public class TestApplication {
log.info(listItems("company").toPrettyString());
+ var eid1 = saveItem("employee", "{\"name\": \"Tom\",\"age\": 18, \"companyId\": %d}".formatted(cid1)).get("data").asLong();
+ var eid2 = saveItem("employee", "{\"name\": \"Jerry\",\"age\": 18, \"companyId\": %d}".formatted(cid1)).get("data").asLong();
+ var eid3 = saveItem("employee", "{\"name\": \"Mike\",\"age\": 18, \"companyId\": %d}".formatted(cid2)).get("data").asLong();
+
+ var employees = listItems("employee");
+ Assert.isTrue(employees.at("/data/items").size() == 3, "数量错误");
+ Assert.isTrue(employees.at("/data/total").asLong() == 3, "返回数量错误");
+
+ var employee1 = detailItem("employee", eid1);
+ Assert.isTrue(eid1 == employee1.at("/data/id").asLong(), "id错误");
+ Assert.isTrue("Tom".equals(employee1.at("/data/name").asText()), "name错误");
+ Assert.isTrue(18 == employee1.at("/data/age").asInt(), "age错误");
+
System.exit(0);
}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java b/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java
index bbe156e..4e51fa1 100644
--- a/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/controller/CompanyController.java
@@ -3,13 +3,14 @@ package com.lanyuanxiaoyao.service.template.controller;
import com.lanyuanxiaoyao.service.template.entity.Company;
import com.lanyuanxiaoyao.service.template.service.CompanyService;
import java.time.LocalDateTime;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
-/**
- * @author lanyuanxiaoyao
- * @version 20250814
- */
@RestController
@RequestMapping("company")
public class CompanyController extends SimpleControllerSupport {
@@ -30,162 +31,56 @@ public class CompanyController extends SimpleControllerSupport listItemMapper() {
- return company -> {
- var item = new ListItem();
- item.setId(company.getId());
- item.setName(company.getName());
- item.setMembers(company.getMembers());
- return item;
- };
+ return company -> new ListItem(
+ company.getId(),
+ company.getName(),
+ company.getMembers()
+ );
}
@Override
protected DetailItemMapper detailItemMapper() {
- return company -> {
- var item = new DetailItem();
- item.setId(company.getId());
- item.setName(company.getName());
- item.setMembers(company.getMembers());
- item.setCreatedTime(company.getCreatedTime());
- item.setModifiedTime(company.getModifiedTime());
- return item;
- };
+ return company -> new DetailItem(
+ company.getId(),
+ company.getName(),
+ company.getMembers(),
+ company.getCreatedTime(),
+ company.getModifiedTime()
+ );
}
+ @Setter
+ @Getter
+ @ToString
+ @AllArgsConstructor
+ @NoArgsConstructor
public static class SaveItem {
private Long id;
private String name;
private Integer members;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getMembers() {
- return members;
- }
-
- public void setMembers(Integer members) {
- this.members = members;
- }
-
- @Override
- public String toString() {
- return "SaveItem{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", members=" + members +
- '}';
- }
}
+ @Setter
+ @Getter
+ @ToString
+ @AllArgsConstructor
+ @NoArgsConstructor
public static class ListItem {
private Long id;
private String name;
private Integer members;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getMembers() {
- return members;
- }
-
- public void setMembers(Integer members) {
- this.members = members;
- }
-
- @Override
- public String toString() {
- return "ListItem{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", members=" + members +
- '}';
- }
}
+ @Setter
+ @Getter
+ @ToString
+ @AllArgsConstructor
+ @NoArgsConstructor
public static class DetailItem {
private Long id;
private String name;
private Integer members;
private LocalDateTime createdTime;
private LocalDateTime modifiedTime;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getMembers() {
- return members;
- }
-
- public void setMembers(Integer members) {
- this.members = members;
- }
-
- public LocalDateTime getCreatedTime() {
- return createdTime;
- }
-
- public void setCreatedTime(LocalDateTime createdTime) {
- this.createdTime = createdTime;
- }
-
- public LocalDateTime getModifiedTime() {
- return modifiedTime;
- }
-
- public void setModifiedTime(LocalDateTime modifiedTime) {
- this.modifiedTime = modifiedTime;
- }
-
- @Override
- public String toString() {
- return "DetailItem{" +
- "id=" + id +
- ", name='" + name + '\'' +
- ", members=" + members +
- ", createdTime=" + createdTime +
- ", modifiedTime=" + modifiedTime +
- '}';
- }
}
}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/controller/EmployeeController.java b/src/test/java/com/lanyuanxiaoyao/service/template/controller/EmployeeController.java
new file mode 100644
index 0000000..0248e94
--- /dev/null
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/controller/EmployeeController.java
@@ -0,0 +1,99 @@
+package com.lanyuanxiaoyao.service.template.controller;
+
+import com.lanyuanxiaoyao.service.template.entity.Employee;
+import com.lanyuanxiaoyao.service.template.service.CompanyService;
+import com.lanyuanxiaoyao.service.template.service.EmployeeService;
+import java.time.LocalDateTime;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("employee")
+public class EmployeeController extends SimpleControllerSupport {
+ private final CompanyService companyService;
+
+ public EmployeeController(EmployeeService service, CompanyService companyService) {
+ super(service);
+ this.companyService = companyService;
+ }
+
+ @Override
+ protected SaveItemMapper saveItemMapper() {
+ return item -> {
+ var employee = new Employee();
+ employee.setId(item.getId());
+ employee.setName(item.getName());
+ employee.setAge(item.getAge());
+ employee.setRole(Employee.Role.USER);
+ employee.setCompany(companyService.detailOrThrow(item.getCompanyId()));
+ return employee;
+ };
+ }
+
+ @Override
+ protected ListItemMapper listItemMapper() {
+ return employee -> new ListItem(
+ employee.getId(),
+ employee.getName(),
+ employee.getAge(),
+ employee.getRole()
+ );
+ }
+
+ @Override
+ protected DetailItemMapper detailItemMapper() {
+ return employee -> new DetailItem(
+ employee.getId(),
+ employee.getCompany().getId(),
+ employee.getName(),
+ employee.getAge(),
+ employee.getRole(),
+ employee.getCreatedTime(),
+ employee.getModifiedTime()
+ );
+ }
+
+ @Setter
+ @Getter
+ @ToString
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class SaveItem {
+ private Long id;
+ private Long companyId;
+ private String name;
+ private Integer age;
+ }
+
+ @Setter
+ @Getter
+ @ToString
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class ListItem {
+ private Long id;
+ private String name;
+ private Integer age;
+ private Employee.Role role;
+ }
+
+ @Setter
+ @Getter
+ @ToString
+ @AllArgsConstructor
+ @NoArgsConstructor
+ public static class DetailItem {
+ private Long id;
+ private Long companyId;
+ private String name;
+ private Integer age;
+ private Employee.Role role;
+ private LocalDateTime createdTime;
+ private LocalDateTime modifiedTime;
+ }
+}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/entity/Company.java b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Company.java
index c1a0a82..e593ede 100644
--- a/src/test/java/com/lanyuanxiaoyao/service/template/entity/Company.java
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Company.java
@@ -1,42 +1,33 @@
package com.lanyuanxiaoyao.service.template.entity;
+import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
+import jakarta.persistence.OneToMany;
+import java.util.Set;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.DynamicUpdate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+@Setter
+@Getter
+@ToString(callSuper = true)
@Entity
@DynamicUpdate
@EntityListeners(AuditingEntityListener.class)
@Comment("企业")
public class Company extends SimpleEntity {
+ @Column(nullable = false)
@Comment("名称")
private String name;
+ @Column(nullable = false)
@Comment("成员数")
private Integer members;
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getMembers() {
- return members;
- }
-
- public void setMembers(Integer members) {
- this.members = members;
- }
-
- @Override
- public String toString() {
- return "Company{" +
- "name='" + name + '\'' +
- ", members=" + members +
- "} " + super.toString();
- }
+ @OneToMany(mappedBy = "company")
+ @ToString.Exclude
+ private Set employees;
}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/entity/Employee.java b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Employee.java
new file mode 100644
index 0000000..4fa6b67
--- /dev/null
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/entity/Employee.java
@@ -0,0 +1,53 @@
+package com.lanyuanxiaoyao.service.template.entity;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.ConstraintMode;
+import jakarta.persistence.Entity;
+import jakarta.persistence.EntityListeners;
+import jakarta.persistence.EnumType;
+import jakarta.persistence.Enumerated;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.ForeignKey;
+import jakarta.persistence.JoinColumn;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.NamedAttributeNode;
+import jakarta.persistence.NamedEntityGraph;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.annotations.Comment;
+import org.hibernate.annotations.DynamicUpdate;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+@Setter
+@Getter
+@ToString(callSuper = true)
+@Entity
+@DynamicUpdate
+@EntityListeners(AuditingEntityListener.class)
+@NamedEntityGraph(name = "employee.detail", attributeNodes = {
+ @NamedAttributeNode("company")
+})
+@Comment("员工")
+public class Employee extends SimpleEntity {
+ @Column(nullable = false)
+ @Comment("名称")
+ private String name;
+ @Column(nullable = false)
+ @Comment("年龄")
+ private Integer age;
+ @Column(nullable = false)
+ @Enumerated(EnumType.STRING)
+ @Comment("角色")
+ private Role role;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(nullable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
+ @ToString.Exclude
+ private Company company;
+
+ public enum Role {
+ USER,
+ ADMIN,
+ }
+}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/repository/CompanyRepository.java b/src/test/java/com/lanyuanxiaoyao/service/template/repository/CompanyRepository.java
index 8c374f8..0424ee3 100644
--- a/src/test/java/com/lanyuanxiaoyao/service/template/repository/CompanyRepository.java
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/repository/CompanyRepository.java
@@ -3,10 +3,6 @@ package com.lanyuanxiaoyao.service.template.repository;
import com.lanyuanxiaoyao.service.template.entity.Company;
import org.springframework.stereotype.Repository;
-/**
- * @author lanyuanxiaoyao
- * @version 20250814
- */
@Repository
public interface CompanyRepository extends SimpleRepository {
}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/repository/EmployeeRepository.java b/src/test/java/com/lanyuanxiaoyao/service/template/repository/EmployeeRepository.java
new file mode 100644
index 0000000..1c0266f
--- /dev/null
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/repository/EmployeeRepository.java
@@ -0,0 +1,15 @@
+package com.lanyuanxiaoyao.service.template.repository;
+
+import com.lanyuanxiaoyao.service.template.entity.Employee;
+import java.util.Optional;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.jpa.repository.EntityGraph;
+import org.springframework.stereotype.Repository;
+
+@SuppressWarnings("NullableProblems")
+@Repository
+public interface EmployeeRepository extends SimpleRepository {
+ @EntityGraph(value = "employee.detail", type = EntityGraph.EntityGraphType.FETCH)
+ @Override
+ Optional findOne(Specification specification);
+}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/service/CompanyService.java b/src/test/java/com/lanyuanxiaoyao/service/template/service/CompanyService.java
index a63f585..88af78d 100644
--- a/src/test/java/com/lanyuanxiaoyao/service/template/service/CompanyService.java
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/service/CompanyService.java
@@ -4,17 +4,9 @@ import com.lanyuanxiaoyao.service.template.entity.Company;
import com.lanyuanxiaoyao.service.template.repository.CompanyRepository;
import org.springframework.stereotype.Service;
-/**
- * @author lanyuanxiaoyao
- * @version 20250814
- */
@Service
public class CompanyService extends SimpleServiceSupport {
public CompanyService(CompanyRepository repository) {
super(repository);
}
-
- public void test() {
-
- }
}
diff --git a/src/test/java/com/lanyuanxiaoyao/service/template/service/EmployeeService.java b/src/test/java/com/lanyuanxiaoyao/service/template/service/EmployeeService.java
new file mode 100644
index 0000000..3b3d0a9
--- /dev/null
+++ b/src/test/java/com/lanyuanxiaoyao/service/template/service/EmployeeService.java
@@ -0,0 +1,12 @@
+package com.lanyuanxiaoyao.service.template.service;
+
+import com.lanyuanxiaoyao.service.template.entity.Employee;
+import com.lanyuanxiaoyao.service.template.repository.EmployeeRepository;
+import org.springframework.stereotype.Service;
+
+@Service
+public class EmployeeService extends SimpleServiceSupport {
+ public EmployeeService(EmployeeRepository repository) {
+ super(repository);
+ }
+}