diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/Persist.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/Persist.java new file mode 100644 index 0000000000000000000000000000000000000000..f47fc6816520dd5dbe724565571ddd3f9bcc0c0d --- /dev/null +++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/Persist.java @@ -0,0 +1,44 @@ +package entity.company8; + +import hibintro.util.HibernateUtil; + +import org.hibernate.Session; +import org.hibernate.Transaction; + +import entity.company8.model.Employee; +import entity.company8.model.Project; + + + + +/** + * Defining many-to-many relationship between + * {@link Employee} and {@link Project} + * + */ +public class Persist { + public static void main(String[] args) { + final Session session = HibernateUtil.createSessionFactory("entity/company8/hibernate.cfg.xml").openSession(); + { + final Transaction transaction = session.beginTransaction(); + final Employee martin = new Employee(123, "Martin Goik"), + eve = new Employee(140, "Eve Blix"), + jim = new Employee(160, "Jim Clarke"); + + session.save(martin); + session.save(eve); + session.save(jim); + + final Project water = new Project(1, "Water supply") + ,health = new Project(2, "Health management"); + + water.addEmployee(martin); + water.addEmployee(eve); + session.save(water); + session.save(health); + + + transaction.commit(); + } + } +} \ No newline at end of file diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/ReassignProjects.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/ReassignProjects.java new file mode 100644 index 0000000000000000000000000000000000000000..73ef378d0f8b0333cef2f60c0bc116e801142414 --- /dev/null +++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/ReassignProjects.java @@ -0,0 +1,48 @@ +package entity.company8; + +import hibintro.util.HibernateUtil; + +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.criterion.Restrictions; + +import entity.company8.model.Employee; +import entity.company8.model.Project; + +public class ReassignProjects { + + public static void main(String[] args) { + + + + final Session session = HibernateUtil.createSessionFactory("entity/company8/hibernate.cfg.xml").openSession(); + { + final Transaction transaction = session.beginTransaction(); + + final Employee + martin = (Employee) session.createCriteria(Employee.class).add( + Restrictions.eq("staffNumber", 123)).list().get(0) + + ,eve = (Employee) session.createCriteria(Employee.class).add( + Restrictions.eq("staffNumber", 140)). list().get(0) + + ,jim = (Employee) session.createCriteria(Employee.class).add( + Restrictions.eq("staffNumber", 160)). list().get(0); + + final Criteria searchProject = session.createCriteria(Project.class); + + final Project water = (Project) searchProject.add( + Restrictions.eq("no", 1)).list().get(0); + + water.removeEmployee(martin); + water.addEmployee(jim); + + + session.save(martin); + session.save(eve); + session.save(jim); + transaction.commit(); + } + } +} \ No newline at end of file diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/hibernate.cfg.xml b/ws/eclipse/HibIntro/src/main/java/entity/company8/hibernate.cfg.xml new file mode 100644 index 0000000000000000000000000000000000000000..dd6f7481c45ef081acccd24c3ea4474a02d3cc3c --- /dev/null +++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/hibernate.cfg.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!DOCTYPE hibernate-configuration PUBLIC + "-//Hibernate/Hibernate Configuration DTD 3.0//EN" + "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> + +<hibernate-configuration> + <session-factory > + <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> + <property name="hibernate.connection.password">XYZ</property> + <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hdm</property> + <property name="hibernate.connection.username">hdmuser</property> + <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> + <property name="hibernate.show_sql">true</property> + <property name="hibernate.format_sql">true</property> + <property name="hibernate.hbm2ddl.auto">update</property> + + <mapping class="entity.company8.model.Employee"/> + <mapping class="entity.company8.model.Project"/> + <mapping class="entity.company8.model.EmployeeProject"/> + </session-factory> +</hibernate-configuration> diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Employee.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Employee.java new file mode 100644 index 0000000000000000000000000000000000000000..72c7fb8f528543a4672dbc166568b1796a79c207 --- /dev/null +++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Employee.java @@ -0,0 +1,69 @@ +package entity.company8.model; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.Cascade; + +import entity.company12.Department; + + +/** + * + * {@link Employee} instances related to {@link Department} + * + */ +@Entity +@Table(uniqueConstraints={@UniqueConstraint(columnNames={"staffNumber"})}) +public class Employee { + + @Id + @GeneratedValue + public Long getId() {return id;} + protected void setId(Long id) {this.id = id;} + private Long id; + + public int getStaffNumber() { return staffNumber;} + public void setStaffNumber(int staffNumber) { this.staffNumber = staffNumber;} + int staffNumber = Integer.MIN_VALUE; + + public String getCname() { return cname;} + public void setCname(String cname) { this.cname = cname;} + private String cname; // Common name + + @OneToMany(orphanRemoval=true,fetch = FetchType.LAZY, mappedBy ="pk.employee", + cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) + + public Set<EmployeeProject> getEmployeeProjects() { return employeeProjects;} + public void setEmployeeProjects(Set<EmployeeProject> employeeProjects) { this.employeeProjects = employeeProjects;} + private Set<EmployeeProject> employeeProjects = new HashSet<EmployeeProject>(); + + protected Employee(){} + + public Employee(final int staffNumber, final String cname) { + setStaffNumber(staffNumber); + setCname(cname); + } + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } else if (other instanceof Employee) { + return getStaffNumber() == ((Employee) other).getStaffNumber(); + } else { + return false; + } + } + @Override + public int hashCode() { return getStaffNumber();} +} \ No newline at end of file diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProject.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProject.java new file mode 100644 index 0000000000000000000000000000000000000000..3a690d668833cebee3fb1ad29bfaa98e3854cff9 --- /dev/null +++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProject.java @@ -0,0 +1,47 @@ +package entity.company8.model; + +import javax.persistence.AssociationOverride; +import javax.persistence.AssociationOverrides; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.Transient; + + +@Entity +@AssociationOverrides({ +@AssociationOverride(name ="pk.employee", joinColumns = @JoinColumn(name ="employee_id")), +@AssociationOverride(name ="pk.project", joinColumns = @JoinColumn(name ="project_id")) + }) +public class EmployeeProject { + + @EmbeddedId + private EmployeeProjectPk getPk() { return pk;} + protected void setPk(EmployeeProjectPk pk) { this.pk = pk;} + private EmployeeProjectPk pk = new EmployeeProjectPk(); + + @Transient + public Employee getEmployee() { return getPk().getEmployee();} + public void setEmployee(Employee employee) { getPk().setEmployee(employee);} + + @Transient + public Project getProject() { return getPk().getProject();} + public void setProject(Project project) { getPk().setProject(project);} + + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (o instanceof EmployeeProject) { + return getPk().equals(((EmployeeProject) o).getPk()); + } else { + return false; + } + } + public int hashCode() { + if (null == getPk()) { + return 0; + } else { + return getPk().hashCode(); + } + } +} diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProjectPk.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProjectPk.java new file mode 100644 index 0000000000000000000000000000000000000000..bc185f2a6051aee2fe5c6b8742d21b96685ed125 --- /dev/null +++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/EmployeeProjectPk.java @@ -0,0 +1,46 @@ +package entity.company8.model; + +import java.io.Serializable; + +import javax.persistence.Embeddable; +import javax.persistence.ManyToOne; + +// See http://giannigar.wordpress.com/2009/09/04/mapping-a-many-to-many-join-table-with-extra-column-using-jpa + +@Embeddable +public class EmployeeProjectPk implements Serializable { + + private static final long serialVersionUID = -8380988172656519306L; + + @ManyToOne + public Employee getEmployee() {return employee; } + public void setEmployee(Employee employee) {this.employee = employee;} + private Employee employee; + + @ManyToOne + public Project getProject() { return project;} + public void setProject(Project project) { this.project = project;} + private Project project; + + public boolean equals(Object o) { + if (this == o) { + return true; + } else if (o instanceof EmployeeProjectPk) { + EmployeeProjectPk that = (EmployeeProjectPk) o; + if (null == getEmployee() && null != that.getEmployee()) { + return false; + } else if (null == getProject() && null != that.getProject()){ + return false; + } else { + return getProject().equals(that.getProject()) && + getEmployee().equals(that.getEmployee()); + } + } else { + return false; + } + } + public int hashCode() { + int result = (employee == null ? 0 : employee.hashCode()); + return 31 * result + (project == null ? 0 : project.hashCode()); + } +} diff --git a/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Project.java b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Project.java new file mode 100644 index 0000000000000000000000000000000000000000..e027c551151f50bbeda38f7706fa31cdbc4c8449 --- /dev/null +++ b/ws/eclipse/HibIntro/src/main/java/entity/company8/model/Project.java @@ -0,0 +1,93 @@ +package entity.company8.model; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; + +import org.hibernate.annotations.Cascade; + +/** + * + * {@link Project} instances related to {@link Employee} + * + */ +@Entity +@Table(uniqueConstraints={@UniqueConstraint(columnNames={"no"})}) +public class Project { + + @Id + @GeneratedValue + public Long getId() {return id;} + protected void setId(Long id) {this.id = id;} + private Long id; + + public int getNo() { return no;} + public void setNo(int no) { this.no = no;} + int no; + + public String getTitle() { return title;} + public void setTitle(String title) { this.title = title;} + String title; + + + @OneToMany(orphanRemoval=true, fetch = FetchType.LAZY, mappedBy ="pk.project", + cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) + public Set<EmployeeProject> getEmployeeProjects() { return employeeProjects;} + public void setEmployeeProjects(Set<EmployeeProject> employeeProjects) { this.employeeProjects = employeeProjects;} + private Set<EmployeeProject> employeeProjects = new HashSet<EmployeeProject>(); + + public void addEmployee(final Employee employee) { + EmployeeProject ep = new EmployeeProject(); + ep.setEmployee(employee); + ep.setProject(this); + getEmployeeProjects().add(ep); + employee.getEmployeeProjects().add(ep); + } + + public void removeEmployee(final Employee employee) { + + Set<EmployeeProject> eps = getEmployeeProjects(); + + for (EmployeeProject ep: eps) { + if (ep.getEmployee().equals(employee)){ + getEmployeeProjects().remove(ep); + employee.getEmployeeProjects().remove(ep); + return; + } + } + + EmployeeProject ep = new EmployeeProject(); + ep.setEmployee(employee); + ep.setProject(this); + getEmployeeProjects().add(ep); + employee.getEmployeeProjects().add(ep); + } + + protected Project(){} + + public Project(final int no, final String title) { + setNo(no); + setTitle(title); + } + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } else if (other instanceof Project) { + return getNo() == ((Project) other).getNo(); + } else { + return false; + } + } + @Override + public int hashCode() { return getNo();} +} \ No newline at end of file