diff --git a/lesson-demo/pom.xml b/lesson-demo/pom.xml index 80b50add..44b09aa4 100644 --- a/lesson-demo/pom.xml +++ b/lesson-demo/pom.xml @@ -11,4 +11,21 @@ lesson-demo + + + jakarta.persistence + jakarta.persistence-api + 3.1.0 + + + org.hibernate + hibernate-core + 6.3.1.Final + + + org.postgresql + postgresql + 42.7.1 + + \ No newline at end of file diff --git a/lesson-demo/src/main/java/com/bobocode/DemoApp.java b/lesson-demo/src/main/java/com/bobocode/DemoApp.java index 21d5205b..faa0c07a 100644 --- a/lesson-demo/src/main/java/com/bobocode/DemoApp.java +++ b/lesson-demo/src/main/java/com/bobocode/DemoApp.java @@ -1,7 +1,55 @@ package com.bobocode; +import com.bobocode.domain.Note; +import com.bobocode.domain.Person; +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; + +import java.util.function.Consumer; + public class DemoApp { + private static EntityManagerFactory emf; public static void main(String[] args) { + emf = Persistence.createEntityManagerFactory("default"); + var noteTitle = "A strange note 3"; + doInTx(em ->{ + var newNote = new Note(); + newNote.setTitle(noteTitle); + newNote.setBody("I don't know who is my owner"); + + var mariana = em.find(Person.class, 230095); +// newNote.setPerson(mariana); + mariana.getNotes().add(newNote); + +// var serhii = em.find(Person.class, 230096); +// serhii.getNotes().add(newNote); +// serhii.addNote(newNote); + + }); + + doInTx(em -> { + var note = em.createQuery("select n from Note n where n.title = ?1", Note.class) + .setParameter(1, noteTitle) + .getSingleResult(); +// System.out.println(note.getPerson().getFirstName()); + }); + emf.close(); + } + + private static void doInTx(Consumer entityManagerConsumer) { + var em = emf.createEntityManager(); + var tx = em.getTransaction(); + try { + tx.begin(); + entityManagerConsumer.accept(em); + tx.commit(); + } catch (Exception e) { + tx.rollback(); + throw e; + } finally { + em.close(); + } } } diff --git a/lesson-demo/src/main/java/com/bobocode/Task1DemoApp.java b/lesson-demo/src/main/java/com/bobocode/Task1DemoApp.java new file mode 100644 index 00000000..aef440ca --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/Task1DemoApp.java @@ -0,0 +1,37 @@ +package com.bobocode; + +import jakarta.persistence.EntityManager; +import jakarta.persistence.EntityManagerFactory; +import jakarta.persistence.Persistence; + +import java.util.function.Consumer; + +public class Task1DemoApp { + private static EntityManagerFactory emf; + + public static void main(String[] args) { + emf = Persistence.createEntityManagerFactory("default"); + + doInTx(em -> { + + }); + + + emf.close(); + } + + private static void doInTx(Consumer entityManagerConsumer) { + var em = emf.createEntityManager(); + var tx = em.getTransaction(); + try { + tx.begin(); + entityManagerConsumer.accept(em); + tx.commit(); + } catch (Exception e) { + tx.rollback(); + throw e; + } finally { + em.close(); + } + } +} diff --git a/lesson-demo/src/main/java/com/bobocode/domain/Note.java b/lesson-demo/src/main/java/com/bobocode/domain/Note.java new file mode 100644 index 00000000..3812dada --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/domain/Note.java @@ -0,0 +1,32 @@ +package com.bobocode.domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; + +import java.time.LocalDateTime; + +import static jakarta.persistence.GenerationType.SEQUENCE; + +@Entity +@Table(name = "notes") +@Setter +@Getter +public class Note { + @Id + @GeneratedValue(strategy = SEQUENCE, generator = "note_id_seq_generator") + @SequenceGenerator(name = "note_id_seq_generator", sequenceName = "notes_id_seq", allocationSize = 1) + private Integer id; + + private String title; + + private String body; + + @CreationTimestamp + private LocalDateTime createdOn; + + @ManyToOne(optional = false) + @JoinColumn(name = "person_id") + private Person person; +} diff --git a/lesson-demo/src/main/java/com/bobocode/domain/Person.java b/lesson-demo/src/main/java/com/bobocode/domain/Person.java new file mode 100644 index 00000000..ec8c2ebb --- /dev/null +++ b/lesson-demo/src/main/java/com/bobocode/domain/Person.java @@ -0,0 +1,52 @@ +package com.bobocode.domain; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.JdbcType; +import org.hibernate.dialect.PostgreSQLEnumJdbcType; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static jakarta.persistence.CascadeType.ALL; +import static jakarta.persistence.GenerationType.SEQUENCE; + +@Entity +@Table(name = "persons") +@Setter +@Getter +public class Person { + @Id + @GeneratedValue(strategy = SEQUENCE, generator = "person_id_seq_generator") + @SequenceGenerator(name = "person_id_seq_generator", sequenceName = "persons_id_seq", allocationSize = 1) + private Integer id; + + @Column(nullable = false) + private String firstName; + + @Column(nullable = false) + private String lastName; + + @Enumerated(EnumType.STRING) + @JdbcType(PostgreSQLEnumJdbcType.class) + private TeamType team; + + @CreationTimestamp + private LocalDateTime createdOn; + + @OneToMany(mappedBy = "person", cascade = ALL) + private List notes = new ArrayList<>(); + + public enum TeamType { + Petros, Hoverla, Blyznytsia, Breskul, Svydovets + } + + + public void addNote(Note note) { + note.setPerson(this); + notes.add(note); + } +} diff --git a/lesson-demo/src/main/resources/META-INF/persistence.xml b/lesson-demo/src/main/resources/META-INF/persistence.xml new file mode 100644 index 00000000..4e33ba96 --- /dev/null +++ b/lesson-demo/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,22 @@ + + + + + org.hibernate.jpa.HibernatePersistenceProvider + + + + + + + + + + + + + \ No newline at end of file