From 7fda2f841bc05057957911a2abe345bc79748513 Mon Sep 17 00:00:00 2001 From: Gunnar Hillert Date: Tue, 17 Apr 2012 17:24:57 -0400 Subject: [PATCH] INTSAMPLES-62 - Create JPA Samples * Sample supports Hibernate, EclipsLink and OpenJPA * Sample uses Spring 3.1 (Profiles) * Retrieves a list of records * Creates a new DB record INTSAMPLES-62 Code Review Fixes * Use Log4j * Fix dependencies INTSAMPLES-62 - Make JPA Sample compliant with INT-2601 * Fix whitespace issues * Make sure all schemas are version-less --- README.md | 1 + basic/jpa/README.md | 40 ++++ basic/jpa/pom.xml | 149 ++++++++++++++ .../integration/samples/jpa/Main.java | 182 ++++++++++++++++++ .../integration/samples/jpa/Person.java | 115 +++++++++++ .../samples/jpa/service/PersonService.java | 47 +++++ .../src/main/resources/H2-CreateTables.sql | 6 + .../jpa/src/main/resources/H2-DropTables.sql | 2 + .../src/main/resources/H2-PopulateData.sql | 2 + .../spring/integration/commonJpa-context.xml | 48 +++++ .../integration/eclipselink-context.xml | 22 +++ .../spring/integration/hibernate-context.xml | 22 +++ .../spring/integration/openjpa-context.xml | 22 +++ .../spring-integration-context.xml | 49 +++++ basic/jpa/src/main/resources/log4j.xml | 28 +++ basic/jpa/src/main/resources/setup-tables.sql | 6 + .../samples/jpa/OutboundGatewayTest.java | 57 ++++++ basic/pom.xml | 1 + 18 files changed, 799 insertions(+) create mode 100644 basic/jpa/README.md create mode 100644 basic/jpa/pom.xml create mode 100644 basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Main.java create mode 100644 basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Person.java create mode 100644 basic/jpa/src/main/java/org/springframework/integration/samples/jpa/service/PersonService.java create mode 100644 basic/jpa/src/main/resources/H2-CreateTables.sql create mode 100644 basic/jpa/src/main/resources/H2-DropTables.sql create mode 100644 basic/jpa/src/main/resources/H2-PopulateData.sql create mode 100644 basic/jpa/src/main/resources/META-INF/spring/integration/commonJpa-context.xml create mode 100644 basic/jpa/src/main/resources/META-INF/spring/integration/eclipselink-context.xml create mode 100644 basic/jpa/src/main/resources/META-INF/spring/integration/hibernate-context.xml create mode 100644 basic/jpa/src/main/resources/META-INF/spring/integration/openjpa-context.xml create mode 100644 basic/jpa/src/main/resources/META-INF/spring/integration/spring-integration-context.xml create mode 100644 basic/jpa/src/main/resources/log4j.xml create mode 100644 basic/jpa/src/main/resources/setup-tables.sql create mode 100644 basic/jpa/src/test/java/org/springframework/integration/samples/jpa/OutboundGatewayTest.java diff --git a/README.md b/README.md index 1777d41e..5bce4e6b 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ This is a good place to get started. The samples here are technically motivated * **jmx** - demonstrates **JMX** support using a **JMX Attribute Polling Channel** and **JMX Operation Invoking Channel Adapter** * **mail** - example showing **IMAP** and **POP3** support * **oddeven** - Example combining the functionality of **Inbound Channel Adapter**, **Filter**, **Router** and **Poller** +* **jpa** - This sample illustrates how the JPA Components can be used * **quote** - Example demoing core EIP support using **Channel Adapter (Inbound and Stdout)**, **Poller** with Interval Trigers, **Service Activator** * **sftp** - demonstrating SFTP support using **SFTP Inbound / Outbound Channel Adapters** * **tcp-client-server** - demonstrates socket communication using **TcpOutboundGateway**, **TcpInboundGateway** and also uses a **Gateway** and a **Service Activator** diff --git a/basic/jpa/README.md b/basic/jpa/README.md new file mode 100644 index 00000000..aa44e6af --- /dev/null +++ b/basic/jpa/README.md @@ -0,0 +1,40 @@ +Spring Integration - JPA Sample +================================ + +# Overview + +This sample illustrates how the JPA Components can be used. The example presented covers the following use cases + +* List all people from the database +* Create a new Person record in the database + +The first example demonstrates the use of an JPA Outbound gateway to retrieve a list of people. The second example uses an JPA Outbound Gateway in order to create a new Person record and then return the newly created Person record. + +You have the option to choose between the following 3 persistence providers: + +* [Hibernate](http://www.hibernate.org/) +* [OpenJPA](http://openjpa.apache.org/) +* [EclipseLink](http://www.eclipse.org/eclipselink/) + +# Getting Started + +Hibernate works out of the box and there are 2 options on how to execute the sample: + +* running the "Main" class from within STS (Right-click on Main class --> Run As --> Java Application) +* or from the command line: + - mvn clean package + - mvn exec:exec + +For **OpenJPA** and **EclipseLink** to work, you must provide a [Java Agent](http://docs.oracle.com/javase/6/docs/api/java/lang/instrument/package-summary.html). When using the Maven Exec Plugin, this is taken care of for you behind the scenes automatically. However, when running the sample from within STS start the Main class with the following JVM flags: + + -javaagent:/path/to/.m2/repository/org/springframework/spring-instrument/3.1.1.RELEASE/spring-instrument-3.1.1.RELEASE.jar + -javaagent:/path/to/.m2/repository/org/apache/openjpa/openjpa/2.2.0/openjpa-2.2.0.jar + +With these flags you will be able to use all 3 persistence providers at once. + +# Resources + +For help please take a look at the Spring Integration documentation: + +http://www.springsource.org/spring-integration + diff --git a/basic/jpa/pom.xml b/basic/jpa/pom.xml new file mode 100644 index 00000000..cb95c6dd --- /dev/null +++ b/basic/jpa/pom.xml @@ -0,0 +1,149 @@ + + 4.0.0 + + org.springframework.integration.samples + jpa + 2.2.0.BUILD-SNAPSHOT + jar + + Samples (Basic) - JPA + http://www.springsource.org/spring-integration + + + 2.2.0 + + + + UTF-8 + 2.2.0.M2 + 1.2.16 + 4.10 + 2.2.0 + 2.3.2 + 4.0.1.Final + 3.1.1.RELEASE + + + + + repo.springsource.org.milestone + Spring Framework Maven Milestone Repository + https://repo.springsource.org/milestone + + + repo.eclipse + Spring Framework Maven Milestone Repository + http://download.eclipse.org/rt/eclipselink/maven.repo/ + + + + central + Maven Central + http://repo1.maven.org/maven2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + -Xlint:all + true + true + + + + org.codehaus.mojo + exec-maven-plugin + 1.2.1 + + java + + -javaagent:${settings.localRepository}/org/springframework/spring-instrument/${spring-instrument.version}/spring-instrument-${spring-instrument.version}.jar + -javaagent:${settings.localRepository}/org/apache/openjpa/openjpa/${openjpa.version}/openjpa-${openjpa.version}.jar + -classpath + + org.springframework.integration.samples.jpa.Main + + + + + + + + + + + + junit + junit + ${junit.version} + test + + + + + + org.springframework.integration + spring-integration-core + ${spring.integration.version} + + + + org.springframework.integration + spring-integration-jpa + ${spring.integration.version} + + + + org.springframework + spring-instrument + ${spring-instrument.version} + + + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + slf4j-log4j12 + 1.6.4 + + + + + + com.h2database + h2 + 1.3.162 + + + + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + + + org.eclipse.persistence + org.eclipse.persistence.jpa + ${eclipselink.version} + + + org.apache.openjpa + openjpa + ${openjpa.version} + + + diff --git a/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Main.java b/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Main.java new file mode 100644 index 00000000..c5d030cc --- /dev/null +++ b/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Main.java @@ -0,0 +1,182 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.samples.jpa; + +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Scanner; + +import org.springframework.context.support.GenericXmlApplicationContext; +import org.springframework.integration.samples.jpa.service.PersonService; +import org.springframework.util.StringUtils; + +/** + * Starts the Spring Context and will initialize the Spring Integration routes. + * + * @author Gunnar Hillert + * @author Amol Nayak + * @version 1.0 + * + */ +public final class Main { + + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss"); + + /** + * Prevent instantiation. + */ + private Main() {} + + /** + * Load the Spring Integration Application Context + * + * @param args - command line arguments + */ + public static void main(final String... args) { + + final Scanner scanner = new Scanner(System.in); + + System.out.println("\n=========================================================" + + "\n " + + "\n Welcome to the Spring Integration JPA Sample! " + + "\n " + + "\n For more information please visit: " + + "\n http://www.springintegration.org/ " + + "\n " + + "\n=========================================================" ); + + System.out.println("Please enter a choice and press : "); + System.out.println("\t1. Use Hibernate"); + System.out.println("\t2. Use OpenJPA"); + System.out.println("\t3. Use EclipseLink"); + + System.out.println("\tq. Quit the application"); + System.out.print("Enter you choice: "); + + final GenericXmlApplicationContext context = new GenericXmlApplicationContext(); + + while (true) { + final String input = scanner.nextLine(); + + if("1".equals(input.trim())) { + context.getEnvironment().setActiveProfiles("hibernate"); + break; + } else if("2".equals(input.trim())) { + context.getEnvironment().setActiveProfiles("openjpa"); + break; + } else if("3".equals(input.trim())) { + context.getEnvironment().setActiveProfiles("eclipselink"); + break; + } else if("q".equals(input.trim())) { + System.out.println("Exiting application...bye."); + System.exit(0); + } else { + System.out.println("Invalid choice\n\n"); + System.out.print("Enter you choice: "); + } + } + + context.load("classpath:META-INF/spring/integration/*-context.xml"); + context.registerShutdownHook(); + context.refresh(); + + final PersonService personService = context.getBean(PersonService.class); + + System.out.println("Please enter a choice and press : "); + System.out.println("\t1. List all people"); + System.out.println("\t2. Create a new person"); + System.out.println("\tq. Quit the application"); + System.out.print("Enter you choice: "); + + while (true) { + final String input = scanner.nextLine(); + + if("1".equals(input.trim())) { + findPeople(personService); + } else if("2".equals(input.trim())) { + createPersonDetails(scanner,personService); + } else if("q".equals(input.trim())) { + break; + } else { + System.out.println("Invalid choice\n\n"); + } + + System.out.println("Please enter a choice and press : "); + System.out.println("\t1. List all people"); + System.out.println("\t2. Create a new person"); + System.out.println("\tq. Quit the application"); + System.out.print("Enter you choice: "); + } + + System.out.println("Exiting application...bye."); + System.exit(0); + + } + + private static void createPersonDetails(final Scanner scanner,PersonService service) { + while(true) { + System.out.print("\nEnter the Person's name:"); + String name = null; + + while(true) { + + name = scanner.nextLine(); + + if (StringUtils.hasText(name)) { + break; + } + + System.out.print("No text entered....Please enter a name:"); + + } + + Person person = new Person(); + person.setName(name); + person = service.createPerson(person); + System.out.println("Created person record with id: " + person.getId()); + System.out.print("Do you want to create another person? (y/n)"); + String choice = scanner.nextLine(); + + if(!"y".equalsIgnoreCase(choice)) { + break; + } + } + } + /** + * @param service + * @param input + */ + private static void findPeople(final PersonService service) { + + System.out.println("ID NAME CREATED"); + System.out.println("=================================="); + + final List people = service.findPeople(); + + if(people != null && !people.isEmpty()) { + for(Person person : people) { + System.out.print(String.format("%d, %s, ", person.getId(), person.getName())); + System.out.println(DATE_FORMAT.format(person.getCreatedDateTime())); + } + } else { + System.out.println( + String.format("No Person record found.")); + } + + System.out.println("==================================\n\n"); + + } +} diff --git a/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Person.java b/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Person.java new file mode 100644 index 00000000..86d6a852 --- /dev/null +++ b/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/Person.java @@ -0,0 +1,115 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.samples.jpa; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +/** + * A simple POJO representing a Person. + * + * @author Amol Nayak + * @author Gunnar Hillert + * + */ +@Entity +@Table(name="PEOPLE") +public class Person { + + @Id + @GeneratedValue(strategy=GenerationType.AUTO) + private int id; + + private String name; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name="CREATED_DATE_TIME") + private Date createdDateTime; + + public Person() { + super(); + this.createdDateTime = new Date(); + } + + public Person(String name) { + super(); + this.name = name; + this.createdDateTime = new Date(); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getCreatedDateTime() { + return createdDateTime; + } + + public void setCreatedDateTime(Date createdDateTime) { + this.createdDateTime = createdDateTime; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + Person other = (Person) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + +} diff --git a/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/service/PersonService.java b/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/service/PersonService.java new file mode 100644 index 00000000..3647f828 --- /dev/null +++ b/basic/jpa/src/main/java/org/springframework/integration/samples/jpa/service/PersonService.java @@ -0,0 +1,47 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.samples.jpa.service; + +import java.util.List; + +import org.springframework.integration.annotation.Payload; +import org.springframework.integration.samples.jpa.Person; + +/** + * The Service is used to create Person instance in database + * + * @author Amol Nayak + * @author Gunnar Hillert + * + */ +public interface PersonService { + + /** + * Creates a {@link Person} instance from the {@link Person} instance passed + * + * @param the created person instance, it will contain the generated primary key and the formated name + * @return The persisted Entity + */ + Person createPerson(Person person); + + /** + * + * @return the matching {@link Person} record(S) + */ + @Payload("new java.util.Date()") + List findPeople(); + +} diff --git a/basic/jpa/src/main/resources/H2-CreateTables.sql b/basic/jpa/src/main/resources/H2-CreateTables.sql new file mode 100644 index 00000000..7d4e55e1 --- /dev/null +++ b/basic/jpa/src/main/resources/H2-CreateTables.sql @@ -0,0 +1,6 @@ +drop table PEOPLE; +DROP TABLE OPENJPA_SEQUENCE_TABLE; + +CREATE TABLE OPENJPA_SEQUENCE_TABLE (ID TINYINT NOT NULL, SEQUENCE_VALUE BIGINT, PRIMARY KEY (ID)); +CREATE TABLE PEOPLE (id BIGINT generated by default as identity, name VARCHAR(255), CREATED_DATE_TIME TIMESTAMP, PRIMARY KEY (id)); + diff --git a/basic/jpa/src/main/resources/H2-DropTables.sql b/basic/jpa/src/main/resources/H2-DropTables.sql new file mode 100644 index 00000000..1891c098 --- /dev/null +++ b/basic/jpa/src/main/resources/H2-DropTables.sql @@ -0,0 +1,2 @@ +drop table OPENJPA_SEQUENCE_TABLE; +drop table PEOPLE; diff --git a/basic/jpa/src/main/resources/H2-PopulateData.sql b/basic/jpa/src/main/resources/H2-PopulateData.sql new file mode 100644 index 00000000..5f6eda40 --- /dev/null +++ b/basic/jpa/src/main/resources/H2-PopulateData.sql @@ -0,0 +1,2 @@ +insert into PEOPLE(id, name, CREATED_DATE_TIME) +values ('1001', 'Cartman', NOW()); diff --git a/basic/jpa/src/main/resources/META-INF/spring/integration/commonJpa-context.xml b/basic/jpa/src/main/resources/META-INF/spring/integration/commonJpa-context.xml new file mode 100644 index 00000000..f386a4b3 --- /dev/null +++ b/basic/jpa/src/main/resources/META-INF/spring/integration/commonJpa-context.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/basic/jpa/src/main/resources/META-INF/spring/integration/eclipselink-context.xml b/basic/jpa/src/main/resources/META-INF/spring/integration/eclipselink-context.xml new file mode 100644 index 00000000..7f58f5bf --- /dev/null +++ b/basic/jpa/src/main/resources/META-INF/spring/integration/eclipselink-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/basic/jpa/src/main/resources/META-INF/spring/integration/hibernate-context.xml b/basic/jpa/src/main/resources/META-INF/spring/integration/hibernate-context.xml new file mode 100644 index 00000000..31008364 --- /dev/null +++ b/basic/jpa/src/main/resources/META-INF/spring/integration/hibernate-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/basic/jpa/src/main/resources/META-INF/spring/integration/openjpa-context.xml b/basic/jpa/src/main/resources/META-INF/spring/integration/openjpa-context.xml new file mode 100644 index 00000000..153580ce --- /dev/null +++ b/basic/jpa/src/main/resources/META-INF/spring/integration/openjpa-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + diff --git a/basic/jpa/src/main/resources/META-INF/spring/integration/spring-integration-context.xml b/basic/jpa/src/main/resources/META-INF/spring/integration/spring-integration-context.xml new file mode 100644 index 00000000..73b5de9b --- /dev/null +++ b/basic/jpa/src/main/resources/META-INF/spring/integration/spring-integration-context.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/basic/jpa/src/main/resources/log4j.xml b/basic/jpa/src/main/resources/log4j.xml new file mode 100644 index 00000000..40d94ca5 --- /dev/null +++ b/basic/jpa/src/main/resources/log4j.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/basic/jpa/src/main/resources/setup-tables.sql b/basic/jpa/src/main/resources/setup-tables.sql new file mode 100644 index 00000000..dee1726a --- /dev/null +++ b/basic/jpa/src/main/resources/setup-tables.sql @@ -0,0 +1,6 @@ +create table IF NOT EXISTS USERS(USERNAME varchar(100),PASSWORD varchar(100), EMAIL varchar(100)); +create table IF NOT EXISTS DUMMY(DUMMY_VALUE varchar(10)); +create table IF NOT EXISTS Person(id integer identity primary key , name varchar(100), gender varchar(1), dateOfBirth date); +INSERT INTO USERS(USERNAME, PASSWORD, EMAIL) VALUES ('a', 'secret', 'spring-integration@awesome.com'); +INSERT INTO USERS(USERNAME, PASSWORD, EMAIL) VALUES ('b', 's3cr3t', 'spring@rocks.com'); +INSERT INTO USERS(USERNAME, PASSWORD, EMAIL) VALUES ('foo', 'bar', 'foo@bar.de'); \ No newline at end of file diff --git a/basic/jpa/src/test/java/org/springframework/integration/samples/jpa/OutboundGatewayTest.java b/basic/jpa/src/test/java/org/springframework/integration/samples/jpa/OutboundGatewayTest.java new file mode 100644 index 00000000..c76764e9 --- /dev/null +++ b/basic/jpa/src/test/java/org/springframework/integration/samples/jpa/OutboundGatewayTest.java @@ -0,0 +1,57 @@ +/* + * Copyright 2002-2012 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.samples.jpa; + +import java.util.Calendar; + +import org.apache.log4j.Logger; +import org.junit.Assert; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.samples.jpa.service.PersonService; + +/** + * + * @author Amol Nayak + * + */ +public class OutboundGatewayTest { + + private static final Logger LOGGER = Logger.getLogger(OutboundGatewayTest.class); + + @Test + public void insertPersonRecord() { + + final ApplicationContext context = new ClassPathXmlApplicationContext( + "classpath:/META-INF/spring/integration/spring-integration-context.xml"); + + final PersonService service = context.getBean(PersonService.class); + + LOGGER.info("Creating person Instance"); + + final Person person = new Person(); + Calendar createdDateTime = Calendar.getInstance(); + createdDateTime.set(1980, 0, 1); + person.setCreatedDateTime(createdDateTime.getTime()); + person.setName("Name Of The Person"); + + final Person persistedPerson = service.createPerson(person); + Assert.assertNotNull("Expected a non null instance of Person, got null", persistedPerson); + LOGGER.info("\n\tGenerated person with id: " + persistedPerson.getId() + ", with name: " + persistedPerson.getName()); + } + +} diff --git a/basic/pom.xml b/basic/pom.xml index bc8a6fd5..5117037d 100644 --- a/basic/pom.xml +++ b/basic/pom.xml @@ -21,6 +21,7 @@ jdbc jms jmx + jpa mail oddeven quote