From 712f35a2ccd5eef0e6c5546fb687ce21c4d84094 Mon Sep 17 00:00:00 2001 From: Petr Rudichev Date: Tue, 18 Feb 2025 20:14:30 +0300 Subject: [PATCH] feat: added two entities Terminal and Visit --- .../example/nto/domain/entity/Terminal.java | 44 +++++++++++++++++++ .../com/example/nto/domain/entity/Visit.java | 39 ++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/src/main/java/com/example/nto/domain/entity/Terminal.java b/src/main/java/com/example/nto/domain/entity/Terminal.java index 05503aa..d1ff6aa 100644 --- a/src/main/java/com/example/nto/domain/entity/Terminal.java +++ b/src/main/java/com/example/nto/domain/entity/Terminal.java @@ -1,4 +1,48 @@ package com.example.nto.domain.entity; +import jakarta.persistence.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.UuidGenerator; + +import java.util.List; + +@Data +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "terminals") public class Terminal { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @Column(name = "name") + @NotBlank(message = "Название не может быть пустым!") + @Size(max = 100, message = "Максимальная длина названия 100 символов!") + private String name; + + // Мне нужна была рандомная генерация кода для терминала, так что я мог сделать кривую реализацию через самописную функцию, + // но боялся, что она будет генерировать не уникальные значения. (я очень смутно представляю, как эта штука работает) + // Код взят отсюда: https://stackoverflow.com/questions/76723290/using-the-new-type-for-uuidgenerator-instead-of-strategy + @UuidGenerator + @NotBlank(message = "Код не может быть пустым!") + @Column(name = "code", nullable = false, unique = true) + private String code; + + // todo: Протестировать нужен ли тут каскад тип + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) + @JoinColumn(name = "office_id", nullable = false) + private Office office; + + @OneToMany(mappedBy = "startTerminal") + private List startVisits; + + @OneToMany(mappedBy = "endTerminal") + private List endVisits; } diff --git a/src/main/java/com/example/nto/domain/entity/Visit.java b/src/main/java/com/example/nto/domain/entity/Visit.java index 0f3ad96..58d2f3b 100644 --- a/src/main/java/com/example/nto/domain/entity/Visit.java +++ b/src/main/java/com/example/nto/domain/entity/Visit.java @@ -1,4 +1,43 @@ package com.example.nto.domain.entity; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@Entity +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name = "visits") public class Visit { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "employee_id", referencedColumnName = "id", nullable = false) + private Employee employee; + + @Column(name = "start_visit", columnDefinition = "TIMESTAMP", nullable = false) + private LocalDateTime startVisit; + + @Column(name = "end_visit", columnDefinition = "TIMESTAMP") + private LocalDateTime endVisit; + + @Column(name = "is_finished", nullable = false) + private boolean isFinished = false; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "start_terminal_id", referencedColumnName = "code", nullable = false) + private Terminal startTerminal; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "end_terminal_id", referencedColumnName = "code") + private Terminal endTerminal; } +