Create a Java project "com.vaani.jpa.eclipselink", create again a folder "lib" and place the required JPA jars and derby.jar into this folder. Add the libs to the project classpath.
Create the package "com.vaani.jpa.eclipselink.model" and the following classes.
Create the file "persistence.xml" in "src/META-INF". Remember to change the path to the database.
The following check is implemented as a JUnit Test. The setup() method will create a few test entries. After the test entries are created, they will be read and the one field of the entries is changed and saved to the database.
Create the package "com.vaani.jpa.eclipselink.model" and the following classes.
import java.util.ArrayList; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; @Entity public class Family { @Id @GeneratedValue(strategy = GenerationType.TABLE) private int id; private String description; @OneToMany(mappedBy = "family") private final List<Person> members = new ArrayList<Person>(); public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public List<Person> getMembers() { return members; } }
import java.util.ArrayList; import java.util.List; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.Transient; @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.TABLE) private String id; private String firstName; private String lastName; private Family family; private String nonsenseField = ""; private List<Job> jobList = new ArrayList<Job>(); public String getId() { return id; } public void setId(String Id) { this.id = Id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } // Leave the standard column name of the table public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } @ManyToOne public Family getFamily() { return family; } public void setFamily(Family family) { this.family = family; } @Transient public String getNonsenseField() { return nonsenseField; } public void setNonsenseField(String nonsenseField) { this.nonsenseField = nonsenseField; } @OneToMany public List<Job> getJobList() { return this.jobList; } public void setJobList(List<Job> nickName) { this.jobList = nickName; } }
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Job { @Id @GeneratedValue(strategy = GenerationType.TABLE) private int id; private double salery; private String jobDescr; public int getId() { return id; } public void setId(int id) { this.id = id; } public double getSalery() { return salery; } public void setSalery(double salery) { this.salery = salery; } public String getJobDescr() { return jobDescr; } public void setJobDescr(String jobDescr) { this.jobDescr = jobDescr; } }
Create the file "persistence.xml" in "src/META-INF". Remember to change the path to the database.
<?xml version="1.0" encoding="UTF-8" ?> <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="people" transaction-type="RESOURCE_LOCAL"> <class>com.vaani.jpa.eclipselink.model.Person</class> <class>com.vaani.jpa.eclipselink.model.Family</class><class>com.vaani.jpa.eclipselink.model.Job</class> <properties> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" /> <property name="javax.persistence.jdbc.url" value="jdbc:derby:/home/vogella/databases/relationsshipDb;create=true" /> <property name="javax.persistence.jdbc.user" value="test" /> <property name="javax.persistence.jdbc.password" value="test" /> <!-- EclipseLink should create the database schema automatically --> <property name="eclipselink.ddl-generation" value="create-tables" /> <property name="eclipselink.ddl-generation.output-mode" value="database" /> </properties> </persistence-unit> </persistence>
The following check is implemented as a JUnit Test. The setup() method will create a few test entries. After the test entries are created, they will be read and the one field of the entries is changed and saved to the database.
import static org.junit.Assert.assertTrue; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import org.junit.Before; import org.junit.Test; import com.vaani.jpa.eclipselink.model.Family; import com.vaani.jpa.eclipselink.model.Person; public class JpaTest { private static final String PERSISTENCE_UNIT_NAME = "people"; private EntityManagerFactory factory; @Before public void setUp() throws Exception { factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME); EntityManager em = factory.createEntityManager(); // Begin a new local transaction so that we can persist a new entity em.getTransaction().begin(); // Read the existing entries Query q = em.createQuery("select m from Person m"); // Persons should be empty // Do we have entries? boolean createNewEntries = (q.getResultList().size() == 0); // No, so lets create new entries if (createNewEntries) { assertTrue(q.getResultList().size() == 0); Family family = new Family(); family.setDescription("Family for the Knopfs"); em.persist(family); for (int i = 0; i < 40; i++) { Person person = new Person(); person.setFirstName("Jim_" + i); person.setLastName("Knopf_" + i); em.persist(person); // First we have to persists the job // Now persists the new person family.getMembers().add(person); em.persist(person); em.persist(family); } } // Commit the transaction, which will cause the entity to // be stored in the database em.getTransaction().commit(); // It is always good practice to close the EntityManager so that // resources are conserved. em.close(); } @Test public void checkAvailablePeople() { // Now lets check the database and see if the created entries are there // Create a fresh, new EntityManager EntityManager em = factory.createEntityManager(); // Perform a simple query for all the Message entities Query q = em.createQuery("select m from Person m"); // We should have 40 Persons in the database assertTrue(q.getResultList().size() == 40); em.close(); } @Test public void checkFamily() { EntityManager em = factory.createEntityManager(); // Go through each of the entities and print out each of their // messages, as well as the date on which it was created Query q = em.createQuery("select f from Family f"); // We should have one family with 40 persons assertTrue(q.getResultList().size() == 1); assertTrue(((Family) q.getSingleResult()).getMembers().size() == 40); em.close(); } @Test(expected = javax.persistence.NoResultException.class) public void deletePerson() { EntityManager em = factory.createEntityManager(); // Begin a new local transaction so that we can persist a new entity em.getTransaction().begin(); Query q = em .createQuery("SELECT p FROM Person p WHERE p.firstName = :firstName AND p.lastName = :lastName"); q.setParameter("firstName", "Jim_1"); q.setParameter("lastName", "Knopf_!"); Person user = (Person) q.getSingleResult(); em.remove(user); em.getTransaction().commit(); Person person = (Person) q.getSingleResult(); // Begin a new local transaction so that we can persist a new entity em.close(); } }
No comments:
Post a Comment