From f33c7f9bf78da7b7611e4205d4057f50223d97b8 Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Mon, 6 Jul 2015 10:46:51 +0200
Subject: [PATCH] A company database

---
 P/Sda1/Company/companyJpa1/.gitignore         |   5 +
 P/Sda1/Company/companyJpa1/pom.xml            | 107 ++++++++++++++++++
 .../mi/company/model/Employee.java            |  36 ++++++
 .../mi/company/model/Project.java             |  59 ++++++++++
 .../mi/company/model/WorksFor.java            |  71 ++++++++++++
 .../main/resources/META-INF/persistence.xml   |  57 ++++++++++
 .../companyJpa1/src/main/resources/log4j2.xml |  21 ++++
 .../hdm_stuttgart/mi/company/TestSchema.java  |  39 +++++++
 .../mi/company/TestUniqueEmail.java           |  45 ++++++++
 9 files changed, 440 insertions(+)
 create mode 100644 P/Sda1/Company/companyJpa1/.gitignore
 create mode 100644 P/Sda1/Company/companyJpa1/pom.xml
 create mode 100644 P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Employee.java
 create mode 100644 P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Project.java
 create mode 100644 P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/WorksFor.java
 create mode 100644 P/Sda1/Company/companyJpa1/src/main/resources/META-INF/persistence.xml
 create mode 100644 P/Sda1/Company/companyJpa1/src/main/resources/log4j2.xml
 create mode 100644 P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestSchema.java
 create mode 100644 P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestUniqueEmail.java

diff --git a/P/Sda1/Company/companyJpa1/.gitignore b/P/Sda1/Company/companyJpa1/.gitignore
new file mode 100644
index 000000000..660be2a5f
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/.gitignore
@@ -0,0 +1,5 @@
+.project
+.classpath
+/.settings/
+/target/
+A1.log
\ No newline at end of file
diff --git a/P/Sda1/Company/companyJpa1/pom.xml b/P/Sda1/Company/companyJpa1/pom.xml
new file mode 100644
index 000000000..feee3116b
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/pom.xml
@@ -0,0 +1,107 @@
+<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>de.hdm-stuttgart.mi</groupId>
+  <artifactId>company</artifactId>
+  <version>1.0</version>
+  <packaging>jar</packaging>
+
+  <name>Company</name>
+  <url>http://www.mi.hdm-stuttgart.de/freedocs</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.2</version>
+        <configuration>
+          <source>1.8</source>
+          <target>1.8</target>
+        </configuration>
+      </plugin>
+      
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-javadoc-plugin</artifactId>
+        <version>2.10.1</version>
+        <configuration>
+          <linksource>true</linksource>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.5</version>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-install-plugin</artifactId>
+        <version>2.5.2</version>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.5</version>
+      </plugin>
+
+    </plugins>
+
+  </build>
+
+  <dependencies>
+
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-entitymanager</artifactId>
+      <version>5.0.0.CR1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hibernate.javax.persistence</groupId>
+      <artifactId>hibernate-jpa-2.1-api</artifactId>
+      <version>1.0.0.Final</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.hibernate</groupId>
+      <artifactId>hibernate-c3p0</artifactId>
+      <version>5.0.0.CR1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>5.1.34</version>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.12</version>
+      <scope>test</scope>
+    </dependency>
+	
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-api</artifactId>
+      <version>2.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.logging.log4j</groupId>
+      <artifactId>log4j-core</artifactId>
+      <version>2.1</version>
+    </dependency>
+
+  </dependencies>
+
+</project>
diff --git a/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Employee.java b/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Employee.java
new file mode 100644
index 000000000..fca11a841
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Employee.java
@@ -0,0 +1,36 @@
+package de.hdm_stuttgart.mi.company.model;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+@Entity
+@Table(
+		uniqueConstraints= {@UniqueConstraint(columnNames={"email"})}
+)
+public class Employee {
+	
+	protected Employee(){}
+	
+	public Employee(final String name, final String email){
+		this.name = name;
+		this.email = email;
+	}
+	
+	@Id
+	@GeneratedValue
+	Long id;
+	
+	String name, email;
+	
+	@OneToMany(mappedBy="employee", cascade=CascadeType.PERSIST)
+	Set<WorksFor> projects = new HashSet<WorksFor>();
+
+}
diff --git a/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Project.java b/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Project.java
new file mode 100644
index 000000000..6c21cf512
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/Project.java
@@ -0,0 +1,59 @@
+package de.hdm_stuttgart.mi.company.model;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+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;
+
+@Entity
+@Table(
+		uniqueConstraints= {@UniqueConstraint(columnNames={"name"})}
+)
+public class Project {
+
+	protected Project(){}
+	
+	public Project(final String name){
+		this.name = name;
+	}
+	
+	@Id
+	@GeneratedValue
+	Long id;
+	
+	String name;
+	
+	@OneToMany(mappedBy="project", cascade=CascadeType.PERSIST)
+	Set<WorksFor> employees = new HashSet<WorksFor>();
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Set<WorksFor> getEmployees() {
+		return employees;
+	}
+
+	public void setEmployees(Set<WorksFor> employees) {
+		this.employees = employees;
+	}
+
+	public Long getId() {
+		return id;
+	}
+	
+	
+	
+}
diff --git a/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/WorksFor.java b/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/WorksFor.java
new file mode 100644
index 000000000..5cebd5335
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/src/main/java/de/hdm_stuttgart/mi/company/model/WorksFor.java
@@ -0,0 +1,71 @@
+package de.hdm_stuttgart.mi.company.model;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+@Entity
+@Table(
+		uniqueConstraints= {@UniqueConstraint(columnNames={"project", "employee"})}
+)
+public class WorksFor {
+	
+	protected WorksFor (){}
+	
+	public WorksFor(final Project project, final Employee employee, final int weekly_hours) {
+		setProject(project);
+		setEmployee(employee);
+		setWeekly_hours(weekly_hours);
+	}
+
+	@Id
+	int id;
+	
+	@ManyToOne(cascade=CascadeType.PERSIST)
+	@JoinColumn(name="project")
+	Project project;
+
+	@ManyToOne(cascade=CascadeType.PERSIST)
+	@JoinColumn(name="employee")
+	Employee employee;
+	
+	int weekly_hours;
+
+	public Project getProject() {
+		return project;
+	}
+
+	public void setProject(Project project) {
+		if (null != this.project && this.project != project ) {
+			this.project.employees.remove(this);
+		}
+		this.project = project;
+		project.employees.add(this);
+	}
+
+	public Employee getEmployee() {
+		return employee;
+	}
+
+	public void setEmployee(Employee employee) {
+		if (null != this.employee && this.employee != employee) {
+			this.employee.projects.remove(this);
+		}
+		this.employee = employee;
+		employee.projects.add(this);
+	}
+
+	public int getWeekly_hours() {
+		return weekly_hours;
+	}
+
+	public void setWeekly_hours(int weekly_hours) {
+		this.weekly_hours = weekly_hours;
+	}
+	
+	
+}
diff --git a/P/Sda1/Company/companyJpa1/src/main/resources/META-INF/persistence.xml b/P/Sda1/Company/companyJpa1/src/main/resources/META-INF/persistence.xml
new file mode 100644
index 000000000..6431ae651
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/src/main/resources/META-INF/persistence.xml
@@ -0,0 +1,57 @@
+<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
+	http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
+	version="2.1">
+
+	<persistence-unit name="create-drop" transaction-type="RESOURCE_LOCAL">
+		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
+		
+		<properties>
+			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/hdm" />
+			<property name="javax.persistence.jdbc.user" value="hdmuser" />
+			<property name="javax.persistence.jdbc.password" value="XYZ" />
+			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
+			
+			<property name="hibernate.show_sql" value="true" />
+			<property name="hibernate.format_sql" value="true" />
+			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
+			<property name="hibernate.hbm2ddl.auto" value="create-drop" />
+			
+			<!-- Configuring Connection Pool -->
+			
+			<property name="hibernate.c3p0.min_size" value="5" />
+			<property name="hibernate.c3p0.max_size" value="20" />
+			<property name="hibernate.c3p0.timeout" value="500" />
+			<property name="hibernate.c3p0.max_statements" value="50" />
+			<property name="hibernate.c3p0.idle_test_period" value="2000" />
+			
+		</properties>
+	</persistence-unit>
+	
+	<persistence-unit name="none" transaction-type="RESOURCE_LOCAL">
+		<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
+		
+		<properties>
+			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/hdm" />
+			<property name="javax.persistence.jdbc.user" value="hdmuser" />
+			<property name="javax.persistence.jdbc.password" value="XYZ" />
+			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
+			
+			<property name="hibernate.show_sql" value="true" />
+			<property name="hibernate.format_sql" value="true" />
+			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
+			<property name="hibernate.hbm2ddl.auto" value="none" />
+			
+			<!-- Configuring Connection Pool -->
+			
+			<property name="hibernate.c3p0.min_size" value="5" />
+			<property name="hibernate.c3p0.max_size" value="20" />
+			<property name="hibernate.c3p0.timeout" value="500" />
+			<property name="hibernate.c3p0.max_statements" value="50" />
+			<property name="hibernate.c3p0.idle_test_period" value="2000" />
+			
+		</properties>
+	</persistence-unit>
+	
+</persistence>
\ No newline at end of file
diff --git a/P/Sda1/Company/companyJpa1/src/main/resources/log4j2.xml b/P/Sda1/Company/companyJpa1/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..eda4f3b0d
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/src/main/resources/log4j2.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+    <Appenders>
+        <File name="A1" fileName="A1.log" append="false">
+            <PatternLayout pattern="%t %-5p %c{2} - %m%n"/>
+        </File>
+        <Console name="STDOUT" target="SYSTEM_OUT">
+            <PatternLayout pattern="%C{2} (%F:%L) - %m%n"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+
+        <!-- You my want to define class or package level per-logger rules -->
+        <Logger name="de.hdm_stuttgart.mi.sda1.catalog2sax.App" level="debug">
+            <AppenderRef ref="A1"/>
+        </Logger>
+        <Root level="debug">
+            <AppenderRef ref="STDOUT"/>
+        </Root>
+    </Loggers>
+</Configuration>
\ No newline at end of file
diff --git a/P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestSchema.java b/P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestSchema.java
new file mode 100644
index 000000000..9ec82fc13
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestSchema.java
@@ -0,0 +1,39 @@
+package de.hdm_stuttgart.mi.company;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+
+import org.junit.Test;
+
+import de.hdm_stuttgart.mi.company.model.Employee;
+import de.hdm_stuttgart.mi.company.model.Project;
+import de.hdm_stuttgart.mi.company.model.WorksFor;
+
+public class TestSchema {
+	
+    static final EntityManager em;
+
+    static {
+	    final EntityManagerFactory emFactory =  Persistence.createEntityManagerFactory("create-drop");
+	    em = emFactory.createEntityManager();
+	}
+
+	@Test
+	public void insertData() {
+		{
+	          final EntityTransaction transaction = em.getTransaction();
+	          transaction.begin();
+	          
+	          final Project bridge = new Project("Bridge");
+	          
+	          final Employee jim = new Employee("Jom Bone", "bone@graveyard.com");
+	          
+	          new WorksFor(bridge, jim, 13);
+	          
+	          em.persist(bridge);
+	          transaction.commit();
+	    }
+	}
+}
\ No newline at end of file
diff --git a/P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestUniqueEmail.java b/P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestUniqueEmail.java
new file mode 100644
index 000000000..ca7e55f95
--- /dev/null
+++ b/P/Sda1/Company/companyJpa1/src/test/java/de/hdm_stuttgart/mi/company/TestUniqueEmail.java
@@ -0,0 +1,45 @@
+package de.hdm_stuttgart.mi.company;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Persistence;
+import javax.persistence.PersistenceException;
+
+import org.hibernate.exception.ConstraintViolationException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import de.hdm_stuttgart.mi.company.model.Employee;
+import de.hdm_stuttgart.mi.company.model.Project;
+import de.hdm_stuttgart.mi.company.model.WorksFor;
+
+public class TestUniqueEmail {
+	
+    static final EntityManager em;
+
+    static {
+	    final EntityManagerFactory emFactory =  Persistence.createEntityManagerFactory("create-drop");
+	    em = emFactory.createEntityManager();
+	}
+
+	@Test	
+	public void insertData() {
+		{
+	          final EntityTransaction transaction = em.getTransaction();
+	          transaction.begin();
+	          
+	          Throwable expectedProblem = null;
+	          try {
+	          em.persist(new Employee("Jom Bone", "bone@graveyard.com"));
+	          em.persist(new Employee("Eve Bone", "bone@graveyard.com"));
+	          
+	          transaction.commit();
+	          } catch (final PersistenceException ex) {
+	        	  expectedProblem = ex.getCause();
+		          transaction.rollback();
+	          }
+        	  Assert.assertTrue(expectedProblem instanceof ConstraintViolationException);
+	    }
+	}
+}
\ No newline at end of file
-- 
GitLab