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