Changes between Version 5 and Version 6 of AdvancedApplicationDevelopment
- Timestamp:
- 08/06/26 13:02:26 (34 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AdvancedApplicationDevelopment
v5 v6 11 11 12 12 Course course = buildCourse(courseDtoFull, language); 13 course = courseRepository.save(course); 13 14 14 15 CourseVersion oldCourseVersion = courseVersionRepository 15 .findBy ActiveTrueAndCourse_Id(course.getId());16 .findByIsActiveTrueAndCourse_CourseId(course.getCourseId()); 16 17 17 18 int newVersionNumber = 1; 18 19 if (oldCourseVersion != null) { 19 20 newVersionNumber = oldCourseVersion.getVersionNumber() + 1; 20 oldCourseVersion.set Active(false);21 oldCourseVersion.setIsActive(false); 21 22 courseVersionRepository.save(oldCourseVersion); 22 23 } … … 24 25 CourseVersion courseVersion = CourseVersion.builder() 25 26 .versionNumber(newVersionNumber) 26 . active(true)27 .creat ionDate(java.time.LocalDate.now())27 .isActive(true) 28 .createdAt(java.time.LocalDate.now()) 28 29 .course(course) 29 30 .build(); … … 90 91 validate.validateCourseTranslation(courseTranslateReq.getId(), courseTranslateReq.getLanguage()); 91 92 92 CourseVersion courseVersion = courseVersionRepository.findBy ActiveTrueAndCourse_Id(courseTranslateReq.getId());93 CourseVersion courseVersion = courseVersionRepository.findByIsActiveTrueAndCourse_CourseId(courseTranslateReq.getId()); 93 94 Course course = courseRepository.findById(courseTranslateReq.getId()).orElseThrow(); 94 95 addCourseTranslation(course, courseTranslateReq); … … 123 124 for (CourseContent content : courseVersion.getCourseContents()) { 124 125 CourseContentTranslateReq contentDto = contentDtos.stream() 125 .filter(ct -> ct.getId().equals(content.get Id()))126 .filter(ct -> ct.getId().equals(content.getCourseContentId())) 126 127 .findFirst() 127 128 .orElseThrow(() -> new RuntimeException( 128 "Missing translation DTO for CourseContent id=" + content.get Id()129 "Missing translation DTO for CourseContent id=" + content.getCourseContentId() 129 130 )); 130 131 … … 147 148 for (CourseLecture lecture : content.getCourseLectures()) { 148 149 CourseLectureTranslateReq lectureDto = lectureDtos.stream() 149 .filter(ld -> ld.getId().equals(lecture.get Id()))150 .filter(ld -> ld.getId().equals(lecture.getCourseLectureId())) 150 151 .findFirst() 151 152 .orElseThrow(() -> new RuntimeException( 152 "Missing translation DTO for CourseLecture id=" + lecture.get Id()153 "Missing translation DTO for CourseLecture id=" + lecture.getCourseLectureId() 153 154 )); 154 155 … … 157 158 .title(lectureDto.getTitle()) 158 159 .description(lectureDto.getDescription()) 160 .contentFileName(lectureDto.getContentFileName()) 159 161 .contentText(lectureDto.getContentText()) 160 162 .courseLecture(lecture) … … 166 168 }}} 167 169 170 == Мапирање на ентитети кон новата шема == 171 172 Новата шема користи PostgreSQL enum типови и `text[]` колона, кои Hibernate не ги мапира автоматски. 173 174 Enum вредностите во базата се со мали букви (`skill`, `topic`, `beginner`, `pending`, ...), затоа Java enum константите мора да ги носат истите имиња преку `@JdbcTypeCode(SqlTypes.NAMED_ENUM)`. 175 {{{ 176 @Entity 177 @Table(name = "tag") 178 public class Tag { 179 180 @Id 181 @GeneratedValue(strategy = GenerationType.IDENTITY) 182 @Column(name = "tag_id") 183 private Long tagId; 184 185 @Enumerated(EnumType.STRING) 186 @JdbcTypeCode(SqlTypes.NAMED_ENUM) 187 @Column(name = "tag_type", columnDefinition = "tag_type") 188 private TagType tagType; 189 } 190 191 public enum TagType { 192 skill, 193 topic 194 } 195 }}} 196 197 Колоната `what_will_be_learned` е `text[]`, па се мапира како `List<String>`. 198 {{{ 199 @Entity 200 @Table(name = "course_translate") 201 public class CourseTranslate { 202 203 @Id 204 @GeneratedValue(strategy = GenerationType.IDENTITY) 205 @Column(name = "course_translate_id") 206 private Long courseTranslateId; 207 208 @JdbcTypeCode(SqlTypes.ARRAY) 209 @Column(name = "what_will_be_learned", columnDefinition = "text[]") 210 private List<String> whatWillBeLearned; 211 212 @ManyToOne(fetch = FetchType.LAZY) 213 @JoinColumn(name = "language_id") 214 private Language language; 215 216 @ManyToOne(fetch = FetchType.LAZY) 217 @JoinColumn(name = "course_id") 218 private Course course; 219 } 220 }}} 221 222 Табелата `user` е резервиран збор во PostgreSQL, па името мора да биде во наводници. 223 {{{ 224 @Entity 225 @Table(name = "\"user\"") 226 public class User { 227 228 @Id 229 @GeneratedValue(strategy = GenerationType.IDENTITY) 230 @Column(name = "user_id") 231 private Long userId; 232 233 @Column(name = "is_verified") 234 private Boolean isVerified; 235 236 @Column(name = "is_profile_complete") 237 private Boolean isProfileComplete; 238 239 @Column(name = "has_used_free_consultation") 240 private Boolean hasUsedFreeConsultation; 241 242 @ManyToOne(fetch = FetchType.LAZY) 243 @JoinColumn(name = "account_id") 244 private Account account; 245 } 246 }}} 247 168 248 == Pooling == 169 249 170 250 Pooling претставува процес каде што не се отвара нова конекција за секој request, туку има константен број на отворени конекции кои се доделуваат на различни requests. Со ова значително се намалува времето по request бидејќи не се губи време за отварање на нова и затворање на стара конекција. 171 251 172 Во мојот проект ова го правам со Hikari Pool во Java Spring Boot. Hikari е автоматски вклучено во Spring Boot (не треба дополнителна конфигурација за користење) преку spring-boot-starter- webбиблиотеката.252 Во мојот проект ова го правам со Hikari Pool во Java Spring Boot. Hikari е автоматски вклучено во Spring Boot (не треба дополнителна конфигурација за користење) преку spring-boot-starter-data-jpa библиотеката. 173 253 {{{ 174 254 <dependency> 175 255 <groupId>org.springframework.boot</groupId> 176 <artifactId>spring-boot-starter- web</artifactId>256 <artifactId>spring-boot-starter-data-jpa</artifactId> 177 257 </dependency> 178 258 }}} … … 197 277 # Максимално времетраење на една конекција (пред да биде заменета со нова) 198 278 spring.datasource.hikari.max-lifetime=1800000 199 }}} 279 280 # Дозволува драјверот да праќа стрингови без експлицитен тип, за PostgreSQL enum колоните 281 spring.datasource.hikari.data-source-properties.stringtype=unspecified 282 }}}
