Commit aaf39701 by Patryk Czarnik

Przeniesienie projektu do nowego repozytorium

parent fd0afffc
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
\ No newline at end of file
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="hr@localhost" uuid="69a0b1e1-6916-48d8-97e3-4c1a6e46c2b2">
<driver-ref>postgresql</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
<jdbc-url>jdbc:postgresql://localhost:5432/hr</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
<data-source source="LOCAL" name="postgres@vps" uuid="b334493d-3cc6-4ff8-aa28-6740ee00ea9c">
<driver-ref>postgresql</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
<jdbc-url>jdbc:postgresql://vps-2bc225bd.vps.ovh.net:5432/hr</jdbc-url>
<jdbc-additional-properties>
<property name="com.intellij.clouds.kubernetes.db.host.port" />
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
<property name="com.intellij.clouds.kubernetes.db.container.port" />
</jdbc-additional-properties>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JpaBuddyIdeaProjectConfig">
<option name="reLastEntityCreationPackage" value="src/main/java/hr/model" />
<option name="reverseEngineeringLastDbConnectionId" value="69a0b1e1-6916-48d8-97e3-4c1a6e46c2b2" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="temurin-21 (2)" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/src/main/java/hr/gotowe/Odczyt14_Native.java" dialect="GenericSQL" />
<file url="PROJECT" dialect="PostgreSQL" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
\ No newline at end of file
## Repozytorium przeniesione
Jest teraz dostępne *jako podkatalog* w nowym miejscu:
https://gitlab.alx.pl/pczarnik/stadler2
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>20240904_Stadler_Hibernate</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.6.1.Final</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.3</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
package abc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Program {
public static void main(String[] args) {
try(Connection c = DriverManager.getConnection("jdbc:postgresql://localhost/hr", "alx", "abc123")) {
System.out.println(c);
// Tego mógłbym użyć, gdyby zależność do Postgresql nie była w scope runtime, tylko domyślnie (compile)
// org.postgresql.jdbc.PgConnection pgc = (org.postgresql.jdbc.PgConnection) c;
// String s = pgc.escapeLiteral("'Ala powiedziała 'to jest spoko' i tyle'");
// System.out.println(s);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
package hr.dto;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Objects;
public class AdressInfo {
private int employeeId;
private String firstName, lastName;
private String jobTitle;
private BigDecimal salary;
private LocalDate hireDate;
private String departmentName;
private String streetAddress;
private String postalCode;
private String city;
private String country;
public AdressInfo() {
}
public AdressInfo(int employeeId, String firstName, String lastName, String jobTitle, BigDecimal salary,
LocalDate hireDate, String departmentName, String streetAddress, String postalCode, String city,
String country) {
this.employeeId = employeeId;
this.firstName = firstName;
this.lastName = lastName;
this.jobTitle = jobTitle;
this.salary = salary;
this.hireDate = hireDate;
this.departmentName = departmentName;
this.streetAddress = streetAddress;
this.postalCode = postalCode;
this.city = city;
this.country = country;
}
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public LocalDate getHireDate() {
return hireDate;
}
public void setHireDate(LocalDate hireDate) {
this.hireDate = hireDate;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public String getStreetAddress() {
return streetAddress;
}
public void setStreetAddress(String streetAddress) {
this.streetAddress = streetAddress;
}
public String getPostalCode() {
return postalCode;
}
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "AdressInfo [employeeId=" + employeeId + ", firstName=" + firstName + ", lastName=" + lastName
+ ", jobTitle=" + jobTitle + ", salary=" + salary + ", hireDate=" + hireDate + ", departmentName="
+ departmentName + ", streetAddress=" + streetAddress + ", postalCode=" + postalCode + ", city=" + city
+ ", country=" + country + "]";
}
@Override
public int hashCode() {
return Objects.hash(city, country, departmentName, employeeId, firstName, hireDate, jobTitle, lastName,
postalCode, salary, streetAddress);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AdressInfo other = (AdressInfo) obj;
return Objects.equals(city, other.city) && Objects.equals(country, other.country)
&& Objects.equals(departmentName, other.departmentName) && employeeId == other.employeeId
&& Objects.equals(firstName, other.firstName) && Objects.equals(hireDate, other.hireDate)
&& Objects.equals(jobTitle, other.jobTitle) && Objects.equals(lastName, other.lastName)
&& Objects.equals(postalCode, other.postalCode) && Objects.equals(salary, other.salary)
&& Objects.equals(streetAddress, other.streetAddress);
}
}
package hr.dto;
import java.math.BigDecimal;
import java.util.Objects;
public class MiniEmp {
private String firstName, lastName;
private String jobTitle;
private BigDecimal salary;
public MiniEmp() {
}
public MiniEmp(String firstName, String lastName, String jobTitle, BigDecimal salary) {
this.firstName = firstName;
this.lastName = lastName;
this.jobTitle = jobTitle;
this.salary = salary;
//System.out.println("salary YES");
}
public MiniEmp(String firstName, String lastName, String jobTitle) {
this.firstName = firstName;
this.lastName = lastName;
this.jobTitle = jobTitle;
//System.out.println("salary NO");
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
@Override
public String toString() {
return "MiniEmp [firstName=" + firstName + ", lastName=" + lastName
+ ", jobTitle=" + jobTitle + ", salary=" + salary + "]";
}
@Override
public int hashCode() {
return Objects.hash(firstName, jobTitle, lastName, salary);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MiniEmp other = (MiniEmp) obj;
return Objects.equals(firstName, other.firstName)
&& Objects.equals(jobTitle, other.jobTitle) && Objects.equals(lastName, other.lastName)
&& Objects.equals(salary, other.salary);
}
}
package hr.dto;
import java.math.BigDecimal;
import java.util.Locale;
import java.util.Objects;
import jakarta.persistence.*;
@Entity
public class PracownikWDepartamencie {
@Id
private int id;
private String departmentName, firstName, lastName, jobTitle;
private BigDecimal salary, depAvg;
private int depPos, globalPos;
public PracownikWDepartamencie() {
}
public PracownikWDepartamencie(int id, String departmentName, String firstName, String lastName, String jobTitle,
BigDecimal salary, BigDecimal depAvg, int depPos, int globalPos) {
this.id = id;
this.departmentName = departmentName;
this.firstName = firstName;
this.lastName = lastName;
this.jobTitle = jobTitle;
this.salary = salary;
this.depAvg = depAvg;
this.depPos = depPos;
this.globalPos = globalPos;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public BigDecimal getDepAvg() {
return depAvg;
}
public void setDepAvg(BigDecimal depAvg) {
this.depAvg = depAvg;
}
public int getDepPos() {
return depPos;
}
public void setDepPos(int depPos) {
this.depPos = depPos;
}
public int getGlobalPos() {
return globalPos;
}
public void setGlobalPos(int globalPos) {
this.globalPos = globalPos;
}
@Override
public String toString() {
return "PracownikWDepartamencie [id=" + id + ", departmentName=" + departmentName + ", firstName=" + firstName
+ ", lastName=" + lastName + ", jobTitle=" + jobTitle + ", salary=" + salary + ", depAvg=" + depAvg
+ ", depPos=" + depPos + ", globalPos=" + globalPos + "]";
}
@Override
public int hashCode() {
return Objects.hash(depAvg, depPos, departmentName, firstName, globalPos, id, jobTitle, lastName, salary);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PracownikWDepartamencie other = (PracownikWDepartamencie) obj;
return Objects.equals(depAvg, other.depAvg) && depPos == other.depPos
&& Objects.equals(departmentName, other.departmentName) && Objects.equals(firstName, other.firstName)
&& globalPos == other.globalPos && id == other.id && Objects.equals(jobTitle, other.jobTitle)
&& Objects.equals(lastName, other.lastName) && Objects.equals(salary, other.salary);
}
public String dajInfo() {
return String.format(Locale.US, "%3d | %-12s %-12s %-33s | %8.2f | %-20s | %8.2f | %2d | %3d |",
id, firstName, lastName, "("+jobTitle+")", salary, departmentName, depAvg, depPos, globalPos);
}
public static String naglowek() {
return String.format(Locale.US, " id | pracownik | pensja | departament | średnia | nr | nr g|");
}
}
package hr.gotowe;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
import hr.model.Employee;
public class Criteria1 {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Employee> cq = cb.createQuery(Employee.class); // typ wyniku
Root<Employee> root = cq.from(Employee.class); // tabela źródłowa
cq.select(root);
TypedQuery<Employee> query = em.createQuery(cq);
List<Employee> lista = query.getResultList();
System.out.println("Odczytano " + lista.size() + " rekordów.");
for (Employee emp : lista) {
System.out.printf("%-15s %-15s %8s %s\n", emp.getFirstName(), emp.getLastName(),
emp.getSalary(), emp.getJob().getJobTitle());
}
em.close();
emf.close();
}
}
package hr.gotowe;
import java.math.BigDecimal;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
import hr.model.Employee;
public class Criteria2 {
public static void main(String[] args) {
BigDecimal minSalary = new BigDecimal(10000);
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
// podajmey klasę dla wyników
CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
// podajemy encję / tabelę źródłową, od której zapytanie startuje
Root<Employee> root = cq.from(Employee.class);
// tak jakby dopisywanie kolejnych fragmentów zapytania
cq.select(root);
cq.where(cb.ge(root.get("salary"), minSalary));
cq.orderBy(cb.desc(root.get("salary")));
// Tutaj zastosowałem tworzenie kryteriów "dynamicznie" na podstawie nazw kolumn
// Istnieje też możliwość wygenerowanie "metamodelu" i posługiwania się nim
TypedQuery<Employee> query = em.createQuery(cq);
List<Employee> lista = query.getResultList();
System.out.println("Odczytano " + lista.size() + " rekordów.");
for (Employee emp : lista) {
System.out.printf("%-15s %-15s %8s %s\n", emp.getFirstName(), emp.getLastName(),
emp.getSalary(), emp.getJob().getJobTitle());
}
em.close();
emf.close();
}
}
package hr.gotowe;
import java.math.BigDecimal;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Root;
import hr.model.Employee;
public class Criteria3 {
public static void main(String[] args) {
BigDecimal minSalary = new BigDecimal(4000);
String szukaneMiasto = "Seattle";
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
Root<Employee> root = cq.from(Employee.class);
cq.select(root);
// e.salary >= minSalary AND e.department.location.city = szukaneMiasto
cq.where(cb.and(cb.ge(root.get("salary"), minSalary),
cb.equal(root.get("department").get("location").get("city"), szukaneMiasto)));
cq.orderBy(cb.desc(root.get("salary")));
TypedQuery<Employee> query = em.createQuery(cq);
List<Employee> lista = query.getResultList();
System.out.println("Odczytano " + lista.size() + " rekordów.");
for (Employee emp : lista) {
String miasto = emp.getDepartment() == null ? "-" : emp.getDepartment().getLocation().getCity();
System.out.printf("%-15s %-15s %-10s %8s %s\n", emp.getFirstName(), emp.getLastName(),
miasto, emp.getSalary(), emp.getJob().getJobTitle());
}
em.close();
emf.close();
}
}
package hr.gotowe;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import hr.model.Employee;
public class Odczyt01_JedenRekord {
public static void main(String[] args) {
System.out.println("Początek");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager();
System.out.println("Udało się połączyć, em = " + em);
Employee emp = em.find(Employee.class, 100);
if(emp == null) {
System.out.println("nie znaleziono");
} else {
System.out.println(emp.getFirstName() + " " + emp.getLastName());
}
em.close();
emf.close();
}
}
package hr.gotowe;
import java.util.Scanner;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import hr.model.Department;
import hr.model.Employee;
public class Odczyt02_JedenRekord_InneTabele {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
System.out.println("Udało się połączyć, em = " + em);
while(true) {
System.out.print("Podaj id pracownika: ");
if(!sc.hasNextInt())
break;
int id = sc.nextInt();
Employee emp = em.find(Employee.class, id);
if(emp == null) {
System.out.println("nie znaleziono");
} else {
System.out.println(emp.getFirstName() + " " + emp.getLastName() + " $" + emp.getSalary());
System.out.println("job: " + emp.getJob().getJobTitle());
Department department = emp.getDepartment();
if (department != null) {
System.out.println("departament: " + department.getDepartmentName());
System.out.println("adres: " + department.getLocation().getStreetAddress() + " "
+ department.getLocation().getCity() + " "
+ department.getLocation().getCountry().getCountryName());
}
System.out.println();
}
}
} finally {
if(em != null)
em.close();
if(emf != null)
emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import hr.model.Employee;
public class Odczyt03_WszystkieRekordy_FindAll {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<Employee> query = em.createNamedQuery("Employee.findAll", Employee.class);
// Wczytuje wszystkie dane od razu do pamięci
List<Employee> lista = query.getResultList();
System.out.println("Ilość rekordów " + lista.size());
for (Employee employee : lista) {
System.out.println(employee.getFirstName() + " " + employee.getLastName());
}
} finally {
if (em != null)
em.close();
if (emf != null)
emf.close();
}
}
}
package hr.gotowe;
import java.util.stream.Stream;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import hr.model.Employee;
public class Odczyt04_WszystkieRekordy_Stream {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<Employee> query = em.createNamedQuery("Employee.findAll", Employee.class);
// Używając Stream zamiast List pobieramy dane "strumieniowo", czyli pojedynczo i przetwarzamy na bieżąco.
Stream<Employee> stream = query.getResultStream();
stream.forEach(emp -> {
System.out.println(emp.getFirstName() + " " + emp.getLastName());
});
} finally {
if (em != null)
em.close();
if (emf != null)
emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import hr.model.Employee;
public class Odczyt05_WszystkieRekordy_JPQL {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<Employee> query = em.createQuery("SELECT emp FROM Employee emp", Employee.class);
List<Employee> lista = query.getResultList();
System.out.println("Ilość rekordów " + lista.size());
for (Employee employee : lista) {
System.out.println(employee.getFirstName() + " " + employee.getLastName());
}
} finally {
if (em != null)
em.close();
if (emf != null)
emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import javax.swing.JOptionPane;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import hr.model.Employee;
public class Odczyt06_Warunek {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
String kogoSzukam = JOptionPane.showInputDialog("Podaj kod stanowiska");
// to działało:
// TypedQuery<Employee> query = em.createQuery("SELECT emp FROM Employee emp WHERE job.jobId = ?1", Employee.class);
// query.setParameter(1, kogoSzukam);
// ale to już nie ("legacy parameter style"):
// TypedQuery<Employee> query = em.createQuery("SELECT emp FROM Employee emp WHERE job.jobId = ?", Employee.class);
// query.setParameter(1, kogoSzukam);
// wszystkie trzy zapisy zadziałały:
// TypedQuery<Employee> query = em.createQuery("SELECT emp FROM Employee emp WHERE job_id = :kto", Employee.class);
// TypedQuery<Employee> query = em.createQuery("SELECT emp FROM Employee emp WHERE job.jobId = :kto", Employee.class);
TypedQuery<Employee> query = em.createQuery("SELECT emp FROM Employee emp WHERE emp.job.jobId = :kto", Employee.class);
query.setParameter("kto", kogoSzukam);
List<Employee> lista = query.getResultList();
System.out.println("Ilość rekordów " + lista.size());
for (Employee employee : lista) {
System.out.println(employee.getFirstName() + " " + employee.getLastName());
//System.out.println(employee.getJob());
}
} finally {
if (em != null)
em.close();
if (emf != null)
emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
public class Odczyt07_Skalar {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<String> query = em.createQuery("SELECT e.lastName FROM Employee e ORDER BY 1", String.class);
// też działa:
// TypedQuery<String> query = em.createQuery("SELECT lastName FROM Employee ORDER BY lastName", String.class);
List<String> names = query.getResultList();
for (String name : names) {
System.out.println(name);
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.Arrays;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
public class Odczyt08_Tablica {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<Object[]> query = em.createQuery("SELECT e.firstName, e.lastName, e.job.jobTitle, e.salary, e.department.departmentName, e.department.location.city FROM Employee e", Object[].class);
List<Object[]> rows = query.getResultList();
for (Object[] emp : rows) {
System.out.println(Arrays.toString(emp));
}
System.out.println("\nSprawdzę typy kolumn:");
Object[] row = rows.get(0);
System.out.println(row[0].getClass().getSimpleName() + " " + row[2].getClass().getSimpleName() + " " + row[3].getClass().getSimpleName());
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import hr.dto.MiniEmp;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
public class Odczyt09_DTO {
// Przykład zastosowania techniki (wzorca projektowego?...) DTO (data transfer object).
// Klasa DTO pełni rolę pomocniczą, nie stanowi głównego modelu aplikacji.
// Obiekty tej klasy służą przekazywaniu parametrów, zwracaniu wyników z metod,
// np. zbieraniu danych z formularza webowego lub - tak jak tutaj - zbieraniu wyników zapytania bazodanowego.
// Technicznie rzecz biorąc: w JPQL można użyć NEW aby stworzyć obiekt za pomocą konstruktora.
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<MiniEmp> query = em.createQuery("SELECT new hr.dto.MiniEmp(e.firstName, e.lastName, e.job.jobTitle, e.salary) FROM Employee e", MiniEmp.class);
List<MiniEmp> emps = query.getResultList();
for (MiniEmp emp : emps) {
System.out.println(emp);
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.Arrays;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
public class Odczyt10_Group {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<Object[]> query = em.createQuery("SELECT e.job.jobTitle, count(*), avg(e.salary) FROM Employee e GROUP BY e.job.jobTitle", Object[].class);
List<Object[]> emps = query.getResultList();
for (Object[] emp : emps) {
System.out.println(Arrays.toString(emp));
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.Arrays;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
public class Odczyt11_Join {
// Przykład JOIN zapisanego w składni JPQL - "przechodzenie po dowiązaniach".
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
System.out.println("Odczyt...");
TypedQuery<Object[]> query = em.createQuery("SELECT e.firstName, e.lastName, d.departmentName, l.city"
+ " FROM Employee e LEFT JOIN e.department d LEFT JOIN d.location l"
+ " ORDER BY l.city, e.lastName, e.firstName", Object[].class);
List<Object[]> emps = query.getResultList();
for (Object[] emp : emps) {
System.out.println(Arrays.toString(emp));
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import hr.model.Employee;
public class Odczyt12_WieleTabel {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
TypedQuery<Object[]> query = em.createQuery(
"SELECT DISTINCT emp, loc.city"
+ " FROM Employee emp, Location loc"
+ " WHERE substring(emp.lastName, 1, 1) = substring(loc.city, 1, 1)"
+ " ORDER BY emp.lastName, emp.firstName",
Object[].class);
List<Object[]> results = query.getResultList();
System.out.println(results.size());
for (Object[] tab : results) {
Employee emp = (Employee)tab[0];
String city = (String)tab[1];
System.out.printf("%-20s %-20s %-20s\n", emp.getFirstName(), emp.getLastName(), city);
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.Query;
// Prosty przykład native query.
// Wynik odczytywany jako lista wierszy, każdy wiersz jako Object[].
public class Odczyt13_Native {
public static void main(String[] args) {
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
Query query = em.createNativeQuery(
"SELECT first_name || ' ' || last_name, job_title, salary FROM employees JOIN jobs USING(job_id) ORDER BY employee_id");
List<?> rows = query.getResultList();
for (Object row : rows) {
// na wszelki wypadek sprawdzam, ale widzę, że Object[] działa
if(row instanceof Object[] cols) {
System.out.println(cols[0] + " pracuje jako " + cols[1] + " i zarabia " + cols[2]);
}
}
System.out.println();
// Biorę pierwszy wiersz i (informacyjnie, dla nas podczas nauki) sprawdzam typy kolumn. Zauważmy, że kolumna salary jest mapowana na BigDecimal.
System.out.println("Sprawdzę typy kolumn:");
Object[] row = (Object[])rows.get(0);
System.out.println(row[0].getClass().getSimpleName() + " " + row[1].getClass().getSimpleName() + " " + row[2].getClass().getSimpleName());
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.Arrays;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.Query;
// Sensowny przykład native query.
// Pokazuję, że dzięki niemu można skorzystać z funkcji konkretnej bazy danych.
// Tutaj (z dokumentacją przed nosem ;) ) wykombinowałem zapytanie z "funkcjami okienkowymi"
// - funkcjonalność znana głównie w Oracle, dostępna także w PostgreSQL.
public class Odczyt14_Native {
public static void main(String[] args) {
final String sql = """
SELECT employee_id AS "id",
department_name AS "departmentName",
first_name AS "firstName",
last_name AS "lastName",
job_title AS "jobTitle",
salary AS "salary",
round(avg(salary) OVER (PARTITION BY department_id), 2) AS "depAvg",
round(salary - avg(salary) OVER (PARTITION BY department_id), 2) AS "diff",
rank() OVER (PARTITION BY department_id ORDER BY salary DESC) AS "depPos",
rank() OVER (ORDER BY salary DESC) AS "globalPos"
FROM departments d
INNER JOIN employees e USING(department_id)
INNER JOIN jobs j USING(job_id)
ORDER BY 7 DESC, 2, 6 DESC, 4 ASC, 3 ASC
""";
System.out.println(sql);
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
Query query = em.createNativeQuery(sql);
List<?> rows = query.getResultList();
for (Object row : rows) {
if (row instanceof Object[]) {
Object[] cols = (Object[]) row;
System.out.println(Arrays.toString(cols));
}
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import hr.dto.PracownikWDepartamencie;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.Query;
// Sensowny przykład native query.
// Pokazuję, że dzięki niemu można skorzystać z funkcji konkretnej bazy danych.
// Tutaj (z dokumentacją przed nosem ;) ) wykombinowałem zapytanie z "funkcjami okienkowymi"
// - funkcjonalność znana głównie w Oracle, dostępna także w PostgreSQL.
// W tej wersji dodatkowo wyniki pakuję do własnej klasy PracownikWDepartamencie
public class Odczyt15_Native_DTO {
public static void main(String[] args) {
final String sql = """
SELECT employee_id AS "id",
department_name AS "departmentName",
first_name AS "firstName",
last_name AS "lastName",
job_title AS "jobTitle",
salary AS "salary",
round(avg(salary) OVER (PARTITION BY department_id), 2) AS "depAvg",
rank() OVER (PARTITION BY department_id ORDER BY salary DESC) AS "depPos",
rank() OVER (ORDER BY salary DESC) AS "globalPos"
FROM departments d
INNER JOIN employees e USING(department_id)
INNER JOIN jobs j USING(job_id)
ORDER BY 7 DESC, 2, 6 DESC, 4 ASC, 3 ASC
""";
System.out.println(sql);
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
Query query = em.createNativeQuery(sql, PracownikWDepartamencie.class);
List<?> rows = query.getResultList();
System.out.println(PracownikWDepartamencie.naglowek());
for (Object row : rows) {
//System.out.println(row);
PracownikWDepartamencie p = (PracownikWDepartamencie)row;
System.out.println(p.dajInfo());
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.List;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.Query;
import hr.model.Country;
// Wracając do prostszych rzeczy: Wynik native query można bez problemu odczytać jako normalną encję.
public class Odczyt16_Native_Entity {
public static void main(String[] args) {
final String sql = "SELECT * FROM countries";
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
Query query = em.createNativeQuery(sql, Country.class);
List<Country> rows = (List<Country>)query.getResultList();
for (Country country : rows) {
System.out.println(country.getCountryId() + " " + country.getCountryName());
}
} finally {
if(em != null) em.close();
if(emf != null) emf.close();
}
}
}
package hr.gotowe;
import java.util.Scanner;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import hr.model.Employee;
public class OdczytajManagerow {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
EntityManagerFactory emf = null;
EntityManager em = null;
try {
emf = Persistence.createEntityManagerFactory("hr");
em = emf.createEntityManager();
while(true) {
System.out.print("\nPodaj id pracownika: ");
if(!sc.hasNextInt())
break;
int id = sc.nextInt();
Employee emp = em.find(Employee.class, id);
if(emp == null) {
System.out.println("nie znaleziono takiego pracownika");
continue;
}
while(emp.getManager() != null) {
emp = em.find(Employee.class, emp.getManager());
System.out.println("Managerem jest:");
System.out.println(" " + emp.getId() + " " + emp.getFirstName() + " " + emp.getLastName()
+ " (" + emp.getJob().getJobTitle() + ") $" + emp.getSalary());
}
}
} finally {
if(em != null)
em.close();
if(emf != null)
emf.close();
}
}
}
package hr.model;
import java.lang.reflect.Field;
import java.util.Collection;
/** Wspólna nadklasa dla wszystkich klas encji w tym pakiecie.
* Miejsce na dodatkowe metody.
* Wykorzystuję je na zdefiniowanie "uniwersalnego toString" za pomocą mechanizmów refleksji.
* Mały problem: wypisanie obiektu powoduje wymuszenie załadowania wszyskich jego pól,
* nawet jeśli są "LAZY" z punktu widzenia Hibernate.
* Dla kolekcji dodałem specjalnego ifa, który nie powoduje wejścia do wnętrza kolekcji.
*/
abstract class AbstractEntity {
public String hello() {
return "hello";
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
Class<? extends AbstractEntity> klasa = this.getClass();
result.append(klasa.getSimpleName()).append(" [");
int fieldNo = 0;
for(Field field : klasa.getDeclaredFields())
try {
if(fieldNo++ > 0) {
result.append(", ");
}
Object value = "";
if(Collection.class.isAssignableFrom(field.getType())) {
value = "[…]";
} else if(field.trySetAccessible()) {
value = field.get(this);
} else {
value = "!";
}
result.append(field.getName()).append('=').append(value);
} catch (IllegalArgumentException | IllegalAccessException e) {
System.err.println(e);
}
result.append("]");
return result.toString();
}
}
package hr.model;
import jakarta.persistence.*;
@Entity
@Table(name = "countries")
public class Country extends AbstractEntity {
@Id
@Column(name = "country_id", nullable = false, length = 2)
private String countryId;
@Column(name = "country_name", length = 40)
private String countryName;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "region_id")
private hr.model.Region region;
public String getCountryId() {
return countryId;
}
public void setCountryId(String countryId) {
this.countryId = countryId;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
public hr.model.Region getRegion() {
return region;
}
public void setRegion(hr.model.Region region) {
this.region = region;
}
}
\ No newline at end of file
package hr.model;
import jakarta.persistence.*;
import org.hibernate.annotations.ColumnDefault;
import java.util.LinkedHashSet;
import java.util.Set;
@Entity
@Table(name = "departments")
public class Department extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ColumnDefault("nextval('departments_seq')")
@Column(name = "department_id", nullable = false)
private Integer id;
@Column(name = "department_name", nullable = false, length = 100)
private String departmentName;
@Column(name = "manager_id")
private Integer managerId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "location_id")
private hr.model.Location location;
/* Kolekcje (List i Set) prowadzące do innych obiektów encji
są domyślnie wiązane w trybie LAZY.
Oznacza to, że lista nie jest od razu uzupełniane elementami,
a następuje to dopiero przy pierwszym dostępie do jej zawartości.
W trybie EAGER lista byłaby wypeniana danymi od razu,
co byłoby potencjalnie dużym problemem wydajnościowym
(zwn na dalsze powiązania tamtych obiektów itd...)
*/
@OneToMany(mappedBy = "department")
private Set<Employee> employees = new LinkedHashSet<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getDepartmentName() {
return departmentName;
}
public void setDepartmentName(String departmentName) {
this.departmentName = departmentName;
}
public Integer getManagerId() {
return managerId;
}
public void setManagerId(Integer managerId) {
this.managerId = managerId;
}
public hr.model.Location getLocation() {
return location;
}
public void setLocation(hr.model.Location location) {
this.location = location;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
\ No newline at end of file
package hr.model;
import jakarta.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDate;
@Entity
@Table(name = "employees")
@NamedQueries({
@NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e ORDER BY e.id"),
@NamedQuery(name="Employee.findByLastName", query="SELECT e FROM Employee e WHERE e.lastName = :lastName ORDER BY e.id"),
})
public class Employee extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "employees_id_gen")
@SequenceGenerator(name = "employees_id_gen", sequenceName = "employees_seq", initialValue = 207, allocationSize = 1)
@Column(name = "employee_id", nullable = false)
private Integer id;
@Column(name = "first_name", length = 25)
private String firstName;
@Column(name = "last_name", nullable = false, length = 30)
private String lastName;
@Column(name = "email", nullable = false, length = 30)
private String email;
@Column(name = "phone_number", length = 20)
private String phoneNumber;
@Column(name = "hire_date", nullable = false)
private LocalDate hireDate;
@Column(name = "salary", precision = 8, scale = 2)
private BigDecimal salary;
@Column(name = "commission_pct", precision = 2, scale = 2)
private BigDecimal commissionPct;
@Column(name = "manager_id")
private Integer manager;
/* Zwykłe pola domyślnie są podłączane jako "EAGER",
czyli są wczytywane wraz z obiektem głównym.
Jeśli jednak oznaczymy zależność jako LAZY, to obiekt Department zostanie załądowany dopiero
przy pierwszym dostępnei do jego pól.
Technicznie jest realizowane za pomocą "klasy proxy", którą dynamicznie tworzy Hibernate.
Aby to działało, klasa Department nie moze być final.
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;
/* Job jest wczytywany w trybie EAGER, czyli od razu wraz z obiektem Employee.
*/
@ManyToOne(optional = false)
@JoinColumn(name = "job_id", nullable = false)
private Job job;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public LocalDate getHireDate() {
return hireDate;
}
public void setHireDate(LocalDate hireDate) {
this.hireDate = hireDate;
}
public hr.model.Job getJob() {
return job;
}
public void setJob(hr.model.Job job) {
this.job = job;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public BigDecimal getCommissionPct() {
return commissionPct;
}
public void setCommissionPct(BigDecimal commissionPct) {
this.commissionPct = commissionPct;
}
public Integer getManager() {
return manager;
}
public void setManager(Integer manager) {
this.manager = manager;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
\ No newline at end of file
package hr.model;
import jakarta.persistence.*;
import java.math.BigDecimal;
import java.util.LinkedHashSet;
import java.util.Set;
@Entity
@Table(name = "jobs")
public class Job extends AbstractEntity {
@Id
@Column(name = "job_id", nullable = false, length = 10)
private String jobId;
@Column(name = "job_title", nullable = false, length = 35)
private String jobTitle;
@Column(name = "min_salary", precision = 8, scale = 2)
private BigDecimal minSalary;
@Column(name = "max_salary", precision = 8, scale = 2)
private BigDecimal maxSalary;
@OneToMany(mappedBy = "job")
private Set<Employee> employees = new LinkedHashSet<>();
public String getJobId() {
return jobId;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public BigDecimal getMinSalary() {
return minSalary;
}
public void setMinSalary(BigDecimal minSalary) {
this.minSalary = minSalary;
}
public BigDecimal getMaxSalary() {
return maxSalary;
}
public void setMaxSalary(BigDecimal maxSalary) {
this.maxSalary = maxSalary;
}
public Set<Employee> getEmployees() {
return employees;
}
public void setEmployees(Set<Employee> employees) {
this.employees = employees;
}
}
\ No newline at end of file
package hr.model;
import jakarta.persistence.*;
import java.time.LocalDate;
@Entity
@Table(name = "job_history")
public class JobHistory extends AbstractEntity {
@EmbeddedId
private JobHistoryId id;
@MapsId("employeeId")
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "employee_id", nullable = false)
private Employee employee;
@Column(name = "end_date", nullable = false)
private LocalDate endDate;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "job_id", nullable = false)
private Job job;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;
public JobHistoryId getId() {
return id;
}
public void setId(JobHistoryId id) {
this.id = id;
}
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public LocalDate getEndDate() {
return endDate;
}
public void setEndDate(LocalDate endDate) {
this.endDate = endDate;
}
public Job getJob() {
return job;
}
public void setJob(Job job) {
this.job = job;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
\ No newline at end of file
package hr.model;
import jakarta.persistence.Column;
import jakarta.persistence.Embeddable;
import org.hibernate.Hibernate;
import java.time.LocalDate;
import java.util.Objects;
@Embeddable
public class JobHistoryId implements java.io.Serializable {
private static final long serialVersionUID = 7844257974829568247L;
@Column(name = "employee_id", nullable = false)
private Integer employeeId;
@Column(name = "start_date", nullable = false)
private LocalDate startDate;
public Integer getEmployeeId() {
return employeeId;
}
public void setEmployeeId(Integer employeeId) {
this.employeeId = employeeId;
}
public LocalDate getStartDate() {
return startDate;
}
public void setStartDate(LocalDate startDate) {
this.startDate = startDate;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
JobHistoryId entity = (JobHistoryId) o;
return Objects.equals(this.employeeId, entity.employeeId) &&
Objects.equals(this.startDate, entity.startDate);
}
@Override
public int hashCode() {
return Objects.hash(employeeId, startDate);
}
}
\ No newline at end of file
package hr.model;
import jakarta.persistence.*;
import org.hibernate.annotations.ColumnDefault;
@Entity
@Table(name = "locations")
@NamedQuery(name = "Location.findAll", query = "SELECT loc FROM Location loc ORDER BY loc.country.id, loc.city")
public class Location extends AbstractEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@ColumnDefault("nextval('locations_seq')")
@Column(name = "location_id", nullable = false)
private Integer id;
@Column(name = "street_address", length = 40)
private String streetAddress;
@Column(name = "postal_code", length = 12)
private String postalCode;
@Column(name = "city", nullable = false, length = 30)
private String city;
@Column(name = "state_province", length = 25)
private String stateProvince;
@ManyToOne
@JoinColumn(name = "country_id")
private Country country;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getStreetAddress() {
return streetAddress;
}
public void setStreetAddress(String streetAddress) {
this.streetAddress = streetAddress;
}
public String getPostalCode() {
return postalCode;
}
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStateProvince() {
return stateProvince;
}
public void setStateProvince(String stateProvince) {
this.stateProvince = stateProvince;
}
public Country getCountry() {
return country;
}
public void setCountry(Country country) {
this.country = country;
}
}
\ No newline at end of file
package hr.model;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "regions")
public class Region extends AbstractEntity {
@Id
@Column(name = "region_id", nullable = false)
private Integer id;
@Column(name = "region_name", length = 25)
private String regionName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
}
\ No newline at end of file
package przyklady;
import hr.model.Country;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import org.hibernate.Session;
public class P0_OdczytajKraj {
public static void main(String[] args) {
System.out.println("Początek main");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
System.out.println("Jest fabryka: " + emf);
EntityManager em = emf.createEntityManager();
System.out.println("Jest EM: " + em + " , klasa: " + em.getClass().getName());
Country country = em.find(Country.class, "UK");
System.out.println(country);
System.out.println("Kod kraju: " + country.getCountryId() + ", nazwa: " + country.getCountryName());
// Gdy naszą implementacją jest Hibernate,
// obiekt EntityManager jest implementowany jako obiekt org.hibernate.Session
// Gdyby tej wersji użyć - to będziemy mieli do dyspozycji więcej metod.
Session session = em.unwrap(Session.class);
// Session session = (Session)em;
Country country2 = session.byId(Country.class).load("US");
System.out.println("Kod kraju: " + country2.getCountryId() + ", nazwa: " + country2.getCountryName());
System.out.println("Zamykamy...");
em.close();
emf.close();
System.out.println("Koniec main");
}
}
package przyklady;
import hr.model.*;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import java.util.Scanner;
public class P1_OdczytajPracownika {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
while(true) {
System.out.print("\nPodaj id pracownika: ");
int id = sc.nextInt();
if(id < 0) break;
Employee employee = em.find(Employee.class, id);
System.out.println(employee);
System.out.println();
// w przypadku braku takiego obiektu wynikiem jest null
if(employee != null) {
System.out.println(employee.getFirstName()
+ " " + employee.getLastName() + " zarabia " + employee.getSalary());
Job job = employee.getJob();
System.out.println("Job: " + job + " " + job.getJobId() + " = " + job.getJobTitle());
Department dep = employee.getDepartment();
if(dep != null) {
System.out.println("Klasa obiektu Department: " + dep.getClass().getName());
// w przypadku zależności LAZY, dopiero teraz zostaną wczytane szczegóły departamentu
System.out.println("Department: " + dep.getDepartmentName());
System.out.println("Adres: " + dep.getLocation().getStreetAddress()
+ " " + dep.getLocation().getCity()
+ " " + dep.getLocation().getCountry().getCountryName());
}
}
}
}
}
}
package przyklady;
import hr.model.Department;
import hr.model.Employee;
import hr.model.Job;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import java.util.List;
import java.util.Scanner;
public class P2_OdczytajWszystkich_JPQL {
public static void main(String[] args) {
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
// JPQL = Jakarta Persistence Query Language
// Jak SQL, ale na poziomie obiektów, z pewnymi różnicami i ograniczeniami.
TypedQuery<Employee> query = em.createQuery("SELECT e FROM Employee e", Employee.class);
List<Employee> employees = query.getResultList();
System.out.println("Odczytano " + employees.size() + " rekordów.");
for(Employee employee : employees) {
System.out.println(employee.getFirstName() + " " + employee.getLastName()
+ " (" + employee.getJob().getJobTitle() + "): " + employee.getSalary());
}
}
}
}
package przyklady;
import hr.model.Employee;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import java.util.List;
public class P3_OdczytajWszystkich_NamedQuery {
public static void main(String[] args) {
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
TypedQuery<Employee> query = em.createNamedQuery("Employee.findAll", Employee.class);
List<Employee> employees = query.getResultList();
System.out.println("Odczytano " + employees.size() + " rekordów.");
for(Employee employee : employees) {
System.out.println(employee.getFirstName() + " " + employee.getLastName()
+ " (" + employee.getJob().getJobTitle() + "): " + employee.getSalary());
}
}
}
}
package przyklady;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import hr.model.Location;
public class P4_OdczytajWszystkich_Stream {
public static void main(String[] args) {
// Zapis z użyciem strumienia może dać lepszą wydajność. Zwróć uwagę na kolejność wykonywania dodatkowych selectów
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
em.createNamedQuery("Location.findAll", Location.class)
.getResultStream()
.map(loc -> String.format(" - %s, %s %s, %s", loc.getStreetAddress(), loc.getPostalCode(), loc.getCity(),
loc.getCountry().getCountryName()))
.forEach(System.out::println);
}
}
}
package przyklady;
import hr.model.Employee;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import jakarta.persistence.TypedQuery;
import java.math.BigDecimal;
import java.util.List;
import java.util.Scanner;
public class P5_Parametry {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
System.out.print("Podaj dwie liczby, zakres pensji: ");
BigDecimal min = scanner.nextBigDecimal();
BigDecimal maks = scanner.nextBigDecimal();
scanner.nextLine();
// JPQL = Jakarta Persistence Query Language
// Jak SQL, ale na poziomie obiektów, z pewnymi różnicami i ograniczeniami.
// Parametry wpisuje się za pomocą :nazwa
final String select1 = "SELECT e FROM Employee e WHERE e.salary BETWEEN :min AND :max ORDER BY e.salary DESC";
TypedQuery<Employee> query1 = em.createQuery(select1, Employee.class);
query1.setParameter("min", min);
query1.setParameter("max", maks);
List<Employee> employees = query1.getResultList();
System.out.println("Odczytano " + employees.size() + " rekordów.");
for(Employee employee : employees) {
System.out.println(employee.getFirstName() + " " + employee.getLastName()
+ " (" + employee.getJob().getJobTitle() + "): " + employee.getSalary());
}
System.out.print("Podaj miasto: ");
String city = scanner.nextLine();
final String select2 = "SELECT e FROM Employee e WHERE e.department.location.city = :city";
TypedQuery<Employee> query2 = em.createQuery(select2, Employee.class);
query2.setParameter("city", city);
query2.getResultStream()
.map(emp -> emp.getFirstName() + " " + emp.getLastName())
.forEach(System.out::println);
}
}
}
package przyklady;
import hr.model.Department;
import hr.model.Employee;
import hr.model.Job;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import java.math.BigDecimal;
import java.util.Scanner;
public class P6_Update {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
em.getTransaction().begin();
while(true) {
System.out.print("\nPodaj id pracownika: ");
int id = sc.nextInt();
sc.nextLine();
if(id < 0) break;
Employee employee = em.find(Employee.class, id);
if(employee == null) {
System.out.println("Nie ma pracownika o takim ID");
continue;
}
System.out.println(employee.getFirstName() + " " + employee.getLastName());
System.out.print("Podaj nowe nazwisko: ");
String noweNazwisko = sc.nextLine();
employee.setLastName(noweNazwisko);
System.out.print("Podaj zmianę pensji: ");
BigDecimal zmiana = sc.nextBigDecimal();
if(zmiana.compareTo(BigDecimal.ZERO) != 0) {
employee.setSalary(employee.getSalary().add(zmiana));
}
// Wywołanie flush zsynchronizowałoby zmiany dokonane w pamięci ze stanem bazy danych
// (wykonałoby UPDATE, INSERT, DELETE)
// ale bez zakomitowania zmian.
// em.flush();
System.out.println(employee.getFirstName() + " " + employee.getLastName());
}
// Niezależnie od użycia flush, transakcję na końcu trzeba zakomitować, aby zmiany zostały zapisane.
// Jeśli robimy commit, to nie potrzebujemy flush
System.out.println("\nCzy zapisać zmiany? [T/N]");
String command = sc.nextLine();
switch(command.toUpperCase()) {
case "T" -> em.getTransaction().commit();
case "N" -> em.getTransaction().rollback();
}
}
}
}
package przyklady;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import hr.model.Department;
import hr.model.Employee;
public class P7_AktualizujRekord2 {
public static void main(String[] args) {
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
em.getTransaction().begin();
Employee king = em.find(Employee.class, 100);
System.out.println(king.getId() + " " + king.getFirstName() + " " + king.getLastName());
Employee kochhar = em.find(Employee.class, 101);
System.out.println(kochhar.getId() + " " + kochhar.getFirstName() + " " + kochhar.getLastName());
Department dep = em.find(Department.class, 90);
System.out.println("departament: " + dep.getDepartmentName());
System.out.println(dep == king.getDepartment());
System.out.println(dep == kochhar.getDepartment());
System.out.println();
System.out.println("Departamenty przed zmianą: "
+ dep.getDepartmentName() + " "
+ king.getDepartment().getDepartmentName() + " "
+ kochhar.getDepartment().getDepartmentName());
king.getDepartment().setDepartmentName("Nowa nazwa");
// king.getDepartment().setDepartmentName("Executive");
System.out.println("Departamenty po zmianie: "
+ dep.getDepartmentName() + " "
+ king.getDepartment().getDepartmentName() + " "
+ kochhar.getDepartment().getDepartmentName());
System.out.println(dep == king.getDepartment());
System.out.println(dep == kochhar.getDepartment());
em.getTransaction().commit();
System.out.println("Zapisane");
}
}
}
package przyklady;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
import hr.model.Country;
import hr.model.Location;
import hr.model.Region;
public class P8_DodajNoweRekordy {
public static void main(String[] args) {
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
em.getTransaction().begin();
// Utworzyć nowy kraj (my podajemy id) i nową lokalizację (id zostanie wygenerowane).
Region region = em.find(Region.class, 1);
Country polska = new Country();
polska.setCountryId("PL");
polska.setCountryName("Polska");
polska.setRegion(region);
System.out.println("Zaraz wykonam country.persist...");
em.persist(polska);
System.out.println("Wykonane");
// Dla lokalizacji nie podajemy ID - ono zostanie wygenerowane z sekwencji.
Location loc = new Location();
loc.setCountry(polska);
loc.setStreetAddress("Jasna");
loc.setCity("Warszawa");
loc.setPostalCode("00-123");
System.out.println("id przed dodaniem " + loc.getId());
em.persist(loc);
System.out.println("id po dodaniu " + loc.getId());
// Standard JPA nie daje gwarancji, że id zostało w tym momencie ustawione,
// ale Hibernate tak to implementuje.
em.getTransaction().commit();
// Po zrobieniu commit id na pewno zostało nadane.
System.out.println("id po commit " + loc.getId());
System.out.println("Zapisano.");
}
}
}
package przyklady;
import hr.model.Location;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class P9_DetachMerge {
public static void main(String[] args) {
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
em.getTransaction().begin();
Location lokalizacja = em.find(Location.class, 1100);
System.out.println(lokalizacja);
System.out.println("detach");
em.detach(lokalizacja);
System.out.println(lokalizacja);
System.out.println("Zmieniam pole");
lokalizacja.setCity("WENECJA");
System.out.println(lokalizacja);
// gdybym teraz zrobił commit, to ta zmiana nie zapisze się w bazie
System.out.println("Ponowny find");
Location lokalizacjaFind = em.find(Location.class, 1100);
System.out.println(lokalizacjaFind);
System.out.println("merge");
Location lokalizacjaMerge = em.merge(lokalizacja);
// obiekt lokalizacja nie zmienił położenia w pamięci i jest oddzielnym obiektem.
// uwaga! dalsze zmiany na nim nie wpływają na obiekty JPA
lokalizacja.setStreetAddress("ULICA WIELKA NOWA");
// To wynik operacji merge jest tym obiekty należącym do puli; tutaj jest on równy lokalizacjaFind
System.out.println("l : " + lokalizacja);
System.out.println("lf: " + lokalizacjaFind);
System.out.println("lm: " + lokalizacjaMerge);
System.out.println(lokalizacja == lokalizacjaFind); // false
System.out.println(lokalizacjaMerge == lokalizacjaFind); // true
em.getTransaction().rollback();
System.out.println("Zrolowano.");
}
}
}
package przyklady;
import hr.model.Country;
import hr.model.Location;
import hr.model.Region;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class P9_Merge {
public static void main(String[] args) {
try(EntityManagerFactory emf = Persistence.createEntityManagerFactory("hr");
EntityManager em = emf.createEntityManager()) {
em.getTransaction().begin();
Location loc = new Location();
loc.setId(3300);
loc.setCountry(em.find(Country.class, "PL"));
loc.setStreetAddress("Ciemna");
loc.setCity("Kraków");
loc.setPostalCode("99-999");
System.out.println(loc);
System.out.println("Ponowny find");
Location lokalizacjaFind = em.find(Location.class, 3300);
System.out.println(lokalizacjaFind);
System.out.println("merge");
// gdyby nie było id - zrobiłby inserta
// jeśli jest id - to robi updejta
Location lokalizacjaMerge = em.merge(loc);
System.out.println("l : " + loc);
System.out.println("lf: " + lokalizacjaFind);
System.out.println("lm: " + lokalizacjaMerge);
em.getTransaction().rollback();
System.out.println("Zrolowano.");
}
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence xmlns="https://jakarta.ee/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence https://jakarta.ee/xml/ns/persistence/persistence_3_1.xsd"
version="3.1">
<persistence-unit name="hr" transaction-type="RESOURCE_LOCAL">
<class>hr.model.Country</class>
<class>hr.model.Department</class>
<class>hr.model.Employee</class>
<class>hr.model.Job</class>
<class>hr.model.JobHistory</class>
<class>hr.model.Location</class>
<class>hr.model.Region</class>
<properties>
<property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/hr"/>
<property name="jakarta.persistence.jdbc.user" value="alx"/>
<property name="jakarta.persistence.jdbc.password" value="abc123"/>
<!--
<property name="jakarta.persistence.jdbc.url" value="jdbc:postgresql://vps-2bc225bd.vps.ovh.net:5432/hr"/>
<property name="jakarta.persistence.jdbc.user" value="alx"/>
<property name="jakarta.persistence.jdbc.password" value="abc123vps"/>
-->
<!-- własności, które często się definiuje, ale jak widać bez nich też działa: -->
<property name="jakarta.persistence.jdbc.driver" value="org.postgresql.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<!-- wypisywanie wszystkich poleceń SQL, które wykonuje Hibernate -->
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment