From 3c91fa3f43976db3397bfd878834e62c387ff4b0 Mon Sep 17 00:00:00 2001 From: Zinaida Budilova Date: Sun, 15 Jan 2023 15:01:16 +0300 Subject: [PATCH] completed hw --- .../java/ru/hh/school/dao/EmployerDao.java | 4 ++- .../java/ru/hh/school/dao/GenericDao.java | 4 +-- .../java/ru/hh/school/dao/VacancyDao.java | 7 +++-- src/main/java/ru/hh/school/entity/Area.java | 8 +++++ .../java/ru/hh/school/entity/Employer.java | 28 ++++++++++++----- src/main/java/ru/hh/school/entity/Resume.java | 12 ++++--- .../java/ru/hh/school/entity/Vacancy.java | 31 +++++++++++++++---- .../ru/hh/school/service/EmployerService.java | 1 + 8 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/main/java/ru/hh/school/dao/EmployerDao.java b/src/main/java/ru/hh/school/dao/EmployerDao.java index 0a0d46d..8cc488a 100644 --- a/src/main/java/ru/hh/school/dao/EmployerDao.java +++ b/src/main/java/ru/hh/school/dao/EmployerDao.java @@ -18,7 +18,9 @@ public EmployerDao(SessionFactory sessionFactory) { */ public Employer getEager(int employerId) { return getSession() - .createQuery("from Employer employer", Employer.class) + .createQuery("FROM Employer e " + + "LEFT JOIN FETCH e.vacancies" + + "WHERE e.id = :employerId", Employer.class) .getSingleResult(); } diff --git a/src/main/java/ru/hh/school/dao/GenericDao.java b/src/main/java/ru/hh/school/dao/GenericDao.java index 70aa8bc..c577076 100644 --- a/src/main/java/ru/hh/school/dao/GenericDao.java +++ b/src/main/java/ru/hh/school/dao/GenericDao.java @@ -4,8 +4,6 @@ import org.hibernate.SessionFactory; import java.io.Serializable; -import java.util.Collection; -import java.util.Objects; public class GenericDao { private final SessionFactory sessionFactory; @@ -25,7 +23,7 @@ public void save(Object object) { if (object == null) { return; } - getSession().save(object); + getSession().saveOrUpdate(object); } protected Session getSession() { diff --git a/src/main/java/ru/hh/school/dao/VacancyDao.java b/src/main/java/ru/hh/school/dao/VacancyDao.java index 195d045..370f6c1 100644 --- a/src/main/java/ru/hh/school/dao/VacancyDao.java +++ b/src/main/java/ru/hh/school/dao/VacancyDao.java @@ -13,8 +13,11 @@ public StatisticsDto getSalaryStatistics(Area area){ // ToDo дополните запрос, чтобы возвращался ru.hh.school.employers.StatisticsDto // https://vladmihalcea.com/the-best-way-to-map-a-projection-query-to-a-dto-with-jpa-and-hibernate/ return getSession().createQuery( - "SELECT count(v.id), min(v.compensationFrom), max(v.compensationTo) " + - "FROM Vacancy v WHERE v.area = :area", StatisticsDto.class) + "SELECT NEW ru.hh.school.employers.StatisticsDto(" + + "COUNT(v.id), MIN(v.compensationFrom), MAX(v.compensationTo)" + + ") " + + "FROM Vacancy v " + + "WHERE v.area = :area", StatisticsDto.class) .setParameter("area", area) .getSingleResult(); } diff --git a/src/main/java/ru/hh/school/entity/Area.java b/src/main/java/ru/hh/school/entity/Area.java index 2288dd9..66bea07 100644 --- a/src/main/java/ru/hh/school/entity/Area.java +++ b/src/main/java/ru/hh/school/entity/Area.java @@ -1,9 +1,17 @@ package ru.hh.school.entity; +import javax.persistence.*; + //TODO: оформите entity +@Entity +@Table(name = "area", schema = "public") public class Area { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "area_id", nullable = false, updatable = false) private Integer id; + @Column(name = "name") private String name; public String getName() { diff --git a/src/main/java/ru/hh/school/entity/Employer.java b/src/main/java/ru/hh/school/entity/Employer.java index 152a66c..ff8ec8b 100644 --- a/src/main/java/ru/hh/school/entity/Employer.java +++ b/src/main/java/ru/hh/school/entity/Employer.java @@ -1,23 +1,37 @@ package ru.hh.school.entity; +import org.hibernate.annotations.CreationTimestamp; + +import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Objects; //TODO: оформите entity +@Entity +@Table(name = "employer", schema = "public") public class Employer { - + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "area_id", nullable = false, updatable = false) private Integer id; + @Column(name = "company_name", nullable = false) private String companyName; // не используйте java.util.Date // https://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#basic-datetime-java8 + @CreationTimestamp + @Column(name = "creation_time", nullable = false, updatable = false) private LocalDateTime creationTime; + @OneToMany(mappedBy = "employer", + cascade = {CascadeType.ALL}, + orphanRemoval = true) private List vacancies = new ArrayList<>(); + @Column(name = "block_time") private LocalDateTime blockTime; public List getVacancies() { @@ -49,16 +63,16 @@ public void setBlockTime(LocalDateTime blockTime) { // https://vladmihalcea.com/hibernate-facts-equals-and-hashcode/ // https://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#mapping-model-pojo-equalshashcode @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Employer employer = (Employer) o; - return Objects.equals(companyName, employer.companyName); + public boolean equals(Object other) { + if (this == other) return true; + if (other == null || getClass() != other.getClass()) return false; + Employer otherEmployer = (Employer) other; + return id.equals(otherEmployer.getId()); } @Override public int hashCode() { - return Objects.hash(companyName); + return (31 * id) ^ 2 + 31 * Objects.hash(companyName); } } diff --git a/src/main/java/ru/hh/school/entity/Resume.java b/src/main/java/ru/hh/school/entity/Resume.java index 7310dda..12e7d28 100644 --- a/src/main/java/ru/hh/school/entity/Resume.java +++ b/src/main/java/ru/hh/school/entity/Resume.java @@ -1,9 +1,10 @@ package ru.hh.school.entity; -import javax.persistence.GeneratedValue; -import javax.persistence.Id; +import javax.persistence.*; //TODO: оформите entity +@Entity +@Table(name = "resume", schema = "public") public class Resume { // TODO: сделать так, чтобы id брался из sequence-а // таким образом, мы сможем отправлять в бд запросы батчами. @@ -15,12 +16,15 @@ public class Resume { // https://vladmihalcea.com/from-jpa-to-hibernates-legacy-and-enhanced-identifier-generators/ @Id - @GeneratedValue(/* здесь место для вашего кода */) + @GeneratedValue(generator = "sequence", strategy = GenerationType.SEQUENCE) + @SequenceGenerator(name = "sequence", sequenceName = "resume_id_seq", allocationSize = 10) + @Column(name = "id", updatable = false, nullable = false) private Integer id; + @Column(name = "description") private String description; - Resume() {} + protected Resume() {} public Resume(String description) { this.description = description; diff --git a/src/main/java/ru/hh/school/entity/Vacancy.java b/src/main/java/ru/hh/school/entity/Vacancy.java index 8d017b4..c0138d4 100644 --- a/src/main/java/ru/hh/school/entity/Vacancy.java +++ b/src/main/java/ru/hh/school/entity/Vacancy.java @@ -1,5 +1,7 @@ package ru.hh.school.entity; +import org.hibernate.annotations.CreationTimestamp; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; @@ -13,26 +15,43 @@ import java.util.Objects; //TODO: оформите entity +@Entity +@Table(name = "vacancy", schema = "public") public class Vacancy { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "vacancy_id", nullable = false, updatable = false) private Integer id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "employer_id", nullable = false) private Employer employer; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "area_id") private Area area; + @Column(name = "title", nullable = false) private String title; + @Column(name = "description") private String description; + @Column(name = "compensation_from") private Integer compensationFrom; + @Column(name = "compensation_to") private Integer compensationTo; + @Column(name = "compensation_gross") private Boolean compensationGross; + @CreationTimestamp + @Column(name = "creation_time", nullable = false, updatable = false) private LocalDateTime creationTime; + @Column(name = "archiving_time") private LocalDateTime archivingTime; public Vacancy() { @@ -91,16 +110,16 @@ public void setArchivingTime(LocalDateTime archivingTime) { } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Vacancy vacancy = (Vacancy) o; - return Objects.equals(id, vacancy.id); + public boolean equals(Object other) { + if (this == other) return true; + if (other == null || getClass() != other.getClass()) return false; + Vacancy otherVacancy = (Vacancy) other; + return id.equals(otherVacancy.getId()); } @Override public int hashCode() { - return 17; + return (31 * id) ^ 2 + 31 * Objects.hash(title); } } diff --git a/src/main/java/ru/hh/school/service/EmployerService.java b/src/main/java/ru/hh/school/service/EmployerService.java index 4822f0d..1ef0aed 100644 --- a/src/main/java/ru/hh/school/service/EmployerService.java +++ b/src/main/java/ru/hh/school/service/EmployerService.java @@ -69,6 +69,7 @@ public void blockIfEmployerUseBadWords(int employerId) { transactionHelper.inTransaction(() -> { employer.setBlockTime(LocalDateTime.now()); employer.getVacancies().forEach(v -> v.setArchivingTime(LocalDateTime.now())); + employerDao.save(employer); }); }