diff --git a/.springBeans b/.springBeans index 34b281cf1..2edd02cf1 100644 --- a/.springBeans +++ b/.springBeans @@ -1,7 +1,7 @@ 1 - + diff --git a/src/main/java/org/springframework/samples/petclinic/BaseEntity.java b/src/main/java/org/springframework/samples/petclinic/BaseEntity.java index bb68af4fc..8913ab009 100644 --- a/src/main/java/org/springframework/samples/petclinic/BaseEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/BaseEntity.java @@ -1,5 +1,8 @@ package org.springframework.samples.petclinic; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; + /** * Simple JavaBean domain object with an id property. * Used as a base class for objects needing this property. @@ -7,9 +10,10 @@ package org.springframework.samples.petclinic; * @author Ken Krebs * @author Juergen Hoeller */ +@MappedSuperclass public class BaseEntity { - - private Integer id; + @Id + protected Integer id; public void setId(Integer id) { diff --git a/src/main/java/org/springframework/samples/petclinic/Clinic.java b/src/main/java/org/springframework/samples/petclinic/Clinic.java index e48e8507b..9eca087e8 100644 --- a/src/main/java/org/springframework/samples/petclinic/Clinic.java +++ b/src/main/java/org/springframework/samples/petclinic/Clinic.java @@ -43,7 +43,7 @@ public interface Clinic { * @return the Owner if found * @throws org.springframework.dao.DataRetrievalFailureException if not found */ - Owner loadOwner(int id) throws DataAccessException; + Owner findOwner(int id) throws DataAccessException; /** * Retrieve a Pet from the data store by id. @@ -51,7 +51,7 @@ public interface Clinic { * @return the Pet if found * @throws org.springframework.dao.DataRetrievalFailureException if not found */ - Pet loadPet(int id) throws DataAccessException; + Pet findPet(int id) throws DataAccessException; /** * Save an Owner to the data store, either inserting or updating it. diff --git a/src/main/java/org/springframework/samples/petclinic/NamedEntity.java b/src/main/java/org/springframework/samples/petclinic/NamedEntity.java index 40c5931d8..f77348e24 100644 --- a/src/main/java/org/springframework/samples/petclinic/NamedEntity.java +++ b/src/main/java/org/springframework/samples/petclinic/NamedEntity.java @@ -1,5 +1,8 @@ package org.springframework.samples.petclinic; +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + /** * Simple JavaBean domain object adds a name property to BaseEntity. * Used as a base class for objects needing these properties. @@ -7,8 +10,10 @@ package org.springframework.samples.petclinic; * @author Ken Krebs * @author Juergen Hoeller */ +@MappedSuperclass public class NamedEntity extends BaseEntity { + @Column(name="name") private String name; diff --git a/src/main/java/org/springframework/samples/petclinic/Owner.java b/src/main/java/org/springframework/samples/petclinic/Owner.java index 75ea3bc06..13639f9d2 100644 --- a/src/main/java/org/springframework/samples/petclinic/Owner.java +++ b/src/main/java/org/springframework/samples/petclinic/Owner.java @@ -6,6 +6,12 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import javax.persistence.Table; + import org.springframework.beans.support.MutableSortDefinition; import org.springframework.beans.support.PropertyComparator; import org.springframework.core.style.ToStringCreator; @@ -17,14 +23,18 @@ import org.springframework.core.style.ToStringCreator; * @author Juergen Hoeller * @author Sam Brannen */ +@Entity @Table(name="owners") public class Owner extends Person { - + @Column(name="address") private String address; - + + @Column(name="city") private String city; + @Column(name="telephone") private String telephone; + @OneToMany(cascade=CascadeType.ALL, mappedBy="owner") private Set pets; diff --git a/src/main/java/org/springframework/samples/petclinic/Person.java b/src/main/java/org/springframework/samples/petclinic/Person.java index da7974a7d..8bfa1b502 100644 --- a/src/main/java/org/springframework/samples/petclinic/Person.java +++ b/src/main/java/org/springframework/samples/petclinic/Person.java @@ -1,15 +1,21 @@ package org.springframework.samples.petclinic; +import javax.persistence.Column; +import javax.persistence.MappedSuperclass; + /** * Simple JavaBean domain object representing an person. * * @author Ken Krebs */ +@MappedSuperclass public class Person extends BaseEntity { + + @Column(name="first_name") + protected String firstName; - private String firstName; - - private String lastName; + @Column(name="last_name") + protected String lastName; public String getFirstName() { return this.firstName; diff --git a/src/main/java/org/springframework/samples/petclinic/Pet.java b/src/main/java/org/springframework/samples/petclinic/Pet.java index f5294b5ca..6b3915891 100644 --- a/src/main/java/org/springframework/samples/petclinic/Pet.java +++ b/src/main/java/org/springframework/samples/petclinic/Pet.java @@ -7,6 +7,14 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + import org.springframework.beans.support.MutableSortDefinition; import org.springframework.beans.support.PropertyComparator; @@ -17,14 +25,21 @@ import org.springframework.beans.support.PropertyComparator; * @author Juergen Hoeller * @author Sam Brannen */ +@Entity @Table(name="pets") public class Pet extends NamedEntity { + @Column(name="birth_date") private Date birthDate; + @ManyToOne + @JoinColumn(name = "type_id") private PetType type; - + + @ManyToOne + @JoinColumn(name = "owner_id") private Owner owner; - + + @OneToMany(cascade=CascadeType.ALL, mappedBy="pet") private Set visits; diff --git a/src/main/java/org/springframework/samples/petclinic/PetType.java b/src/main/java/org/springframework/samples/petclinic/PetType.java index aaadc5c44..4e4cebc4b 100644 --- a/src/main/java/org/springframework/samples/petclinic/PetType.java +++ b/src/main/java/org/springframework/samples/petclinic/PetType.java @@ -1,8 +1,12 @@ package org.springframework.samples.petclinic; +import javax.persistence.Entity; +import javax.persistence.Table; + /** * @author Juergen Hoeller */ +@Entity @Table(name="types") public class PetType extends NamedEntity { } diff --git a/src/main/java/org/springframework/samples/petclinic/Specialty.java b/src/main/java/org/springframework/samples/petclinic/Specialty.java index d19ccaba9..08a6e85c7 100644 --- a/src/main/java/org/springframework/samples/petclinic/Specialty.java +++ b/src/main/java/org/springframework/samples/petclinic/Specialty.java @@ -1,10 +1,14 @@ package org.springframework.samples.petclinic; +import javax.persistence.Entity; +import javax.persistence.Table; + /** * Models a {@link Vet Vet's} specialty (for example, dentistry). * * @author Juergen Hoeller */ +@Entity @Table(name="specialties") public class Specialty extends NamedEntity { } diff --git a/src/main/java/org/springframework/samples/petclinic/Vet.java b/src/main/java/org/springframework/samples/petclinic/Vet.java index 9c7c8da0b..e4250ae9c 100644 --- a/src/main/java/org/springframework/samples/petclinic/Vet.java +++ b/src/main/java/org/springframework/samples/petclinic/Vet.java @@ -5,6 +5,10 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; + +import javax.persistence.Entity; +import javax.persistence.ManyToMany; +import javax.persistence.Table; import javax.xml.bind.annotation.XmlElement; import org.springframework.beans.support.MutableSortDefinition; @@ -18,8 +22,10 @@ import org.springframework.beans.support.PropertyComparator; * @author Sam Brannen * @author Arjen Poutsma */ +@Entity @Table(name="vets") public class Vet extends Person { + @ManyToMany private Set specialties; diff --git a/src/main/java/org/springframework/samples/petclinic/Visit.java b/src/main/java/org/springframework/samples/petclinic/Visit.java index c42bdcee5..7d7502d1a 100644 --- a/src/main/java/org/springframework/samples/petclinic/Visit.java +++ b/src/main/java/org/springframework/samples/petclinic/Visit.java @@ -2,20 +2,31 @@ package org.springframework.samples.petclinic; import java.util.Date; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + /** * Simple JavaBean domain object representing a visit. * * @author Ken Krebs */ +@Entity @Table(name="visits") public class Visit extends BaseEntity { /** Holds value of property date. */ + @Column(name="visit_date") private Date date; /** Holds value of property description. */ + @Column(name="description") private String description; /** Holds value of property pet. */ + @ManyToOne + @JoinColumn(name = "pet_id") private Pet pet; diff --git a/src/main/java/org/springframework/samples/petclinic/hibernate/HibernateClinic.java b/src/main/java/org/springframework/samples/petclinic/hibernate/HibernateClinic.java deleted file mode 100644 index 411638562..000000000 --- a/src/main/java/org/springframework/samples/petclinic/hibernate/HibernateClinic.java +++ /dev/null @@ -1,98 +0,0 @@ -package org.springframework.samples.petclinic.hibernate; - -import java.util.Collection; - -import org.hibernate.SessionFactory; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.DataAccessException; -import org.springframework.samples.petclinic.Clinic; -import org.springframework.samples.petclinic.Owner; -import org.springframework.samples.petclinic.Pet; -import org.springframework.samples.petclinic.PetType; -import org.springframework.samples.petclinic.Vet; -import org.springframework.samples.petclinic.Visit; -import org.springframework.stereotype.Repository; -import org.springframework.transaction.annotation.Transactional; - -/** - * Hibernate implementation of the Clinic interface. - * - *

The mappings are defined in "petclinic.hbm.xml", located in the root of the - * class path. - * - *

Note that transactions are declared with annotations and that some methods - * contain "readOnly = true" which is an optimization that is particularly - * valuable when using Hibernate (to suppress unnecessary flush attempts for - * read-only operations). - * - * @author Juergen Hoeller - * @author Sam Brannen - * @author Mark Fisher - * @since 19.10.2003 - */ -@Repository -@Transactional -public class HibernateClinic implements Clinic { - - private SessionFactory sessionFactory; - - @Autowired - public HibernateClinic(SessionFactory sessionFactory) { - this.sessionFactory = sessionFactory; - } - - @Transactional(readOnly = true) - @SuppressWarnings("unchecked") - public Collection getVets() { - return sessionFactory.getCurrentSession().createQuery("from Vet vet order by vet.lastName, vet.firstName").list(); - } - - @Transactional(readOnly = true) - @SuppressWarnings("unchecked") - public Collection getPetTypes() { - return sessionFactory.getCurrentSession().createQuery("from PetType type order by type.name").list(); - } - - @Transactional(readOnly = true) - @SuppressWarnings("unchecked") - public Collection findOwners(String lastName) { - return sessionFactory.getCurrentSession().createQuery("from Owner owner where owner.lastName like :lastName") - .setString("lastName", lastName + "%").list(); - } - - @Transactional(readOnly = true) - public Owner loadOwner(int id) { - return (Owner) sessionFactory.getCurrentSession().load(Owner.class, id); - } - - @Transactional(readOnly = true) - public Pet loadPet(int id) { - return (Pet) sessionFactory.getCurrentSession().load(Pet.class, id); - } - - public void storeOwner(Owner owner) { - // Note: Hibernate3's merge operation does not reassociate the object - // with the current Hibernate Session. Instead, it will always copy the - // state over to a registered representation of the entity. In case of a - // new entity, it will register a copy as well, but will not update the - // id of the passed-in object. To still update the ids of the original - // objects too, we need to register Spring's - // IdTransferringMergeEventListener on our SessionFactory. - sessionFactory.getCurrentSession().merge(owner); - } - - public void storePet(Pet pet) { - sessionFactory.getCurrentSession().merge(pet); - } - - public void storeVisit(Visit visit) { - sessionFactory.getCurrentSession().merge(visit); - } - - public void deletePet(int id) throws DataAccessException { - Pet pet = loadPet(id); - sessionFactory.getCurrentSession().delete(pet); - } - -} diff --git a/src/main/java/org/springframework/samples/petclinic/hibernate/package-info.java b/src/main/java/org/springframework/samples/petclinic/hibernate/package-info.java deleted file mode 100644 index e39ebac47..000000000 --- a/src/main/java/org/springframework/samples/petclinic/hibernate/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ - -/** - * - * The classes in this package represent the Hibernate implementation - * of PetClinic's persistence layer. - * - */ -package org.springframework.samples.petclinic.hibernate; - diff --git a/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java b/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java index cc2633875..7baef0971 100644 --- a/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java +++ b/src/main/java/org/springframework/samples/petclinic/jdbc/SimpleJdbcClinic.java @@ -163,7 +163,7 @@ public class SimpleJdbcClinic implements Clinic, SimpleJdbcClinicMBean { * owner, if not already loaded. */ @Transactional(readOnly = true) - public Owner loadOwner(int id) throws DataAccessException { + public Owner findOwner(int id) throws DataAccessException { Owner owner; try { owner = this.simpleJdbcTemplate.queryForObject( @@ -179,7 +179,7 @@ public class SimpleJdbcClinic implements Clinic, SimpleJdbcClinicMBean { } @Transactional(readOnly = true) - public Pet loadPet(int id) throws DataAccessException { + public Pet findPet(int id) throws DataAccessException { JdbcPet pet; try { pet = this.simpleJdbcTemplate.queryForObject( @@ -190,7 +190,7 @@ public class SimpleJdbcClinic implements Clinic, SimpleJdbcClinicMBean { catch (EmptyResultDataAccessException ex) { throw new ObjectRetrievalFailureException(Pet.class, new Integer(id)); } - Owner owner = loadOwner(pet.getOwnerId()); + Owner owner = findOwner(pet.getOwnerId()); owner.addPet(pet); pet.setType(EntityUtils.getById(getPetTypes(), PetType.class, pet.getTypeId())); loadVisits(pet); diff --git a/src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java b/src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java index 92fe1e247..d3fe8ef36 100644 --- a/src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java +++ b/src/main/java/org/springframework/samples/petclinic/jpa/EntityManagerClinic.java @@ -55,12 +55,12 @@ public class EntityManagerClinic implements Clinic { } @Transactional(readOnly = true) - public Owner loadOwner(int id) { + public Owner findOwner(int id) { return this.em.find(Owner.class, id); } @Transactional(readOnly = true) - public Pet loadPet(int id) { + public Pet findPet(int id) { return this.em.find(Pet.class, id); } @@ -89,7 +89,7 @@ public class EntityManagerClinic implements Clinic { } public void deletePet(int id) throws DataAccessException { - Pet pet = loadPet(id); + Pet pet = findPet(id); this.em.remove(pet); } diff --git a/src/main/java/org/springframework/samples/petclinic/web/AddPetController.java b/src/main/java/org/springframework/samples/petclinic/web/AddPetController.java index 314b301b1..3d429d4bf 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/AddPetController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/AddPetController.java @@ -54,7 +54,7 @@ public class AddPetController { @RequestMapping(method = RequestMethod.GET) public String setupForm(@PathVariable("ownerId") int ownerId, Model model) { - Owner owner = this.clinic.loadOwner(ownerId); + Owner owner = this.clinic.findOwner(ownerId); Pet pet = new Pet(); owner.addPet(pet); model.addAttribute("pet", pet); diff --git a/src/main/java/org/springframework/samples/petclinic/web/AddVisitController.java b/src/main/java/org/springframework/samples/petclinic/web/AddVisitController.java index 931256879..64a09edd5 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/AddVisitController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/AddVisitController.java @@ -46,7 +46,7 @@ public class AddVisitController { @RequestMapping(method = RequestMethod.GET) public String setupForm(@PathVariable("petId") int petId, Model model) { - Pet pet = this.clinic.loadPet(petId); + Pet pet = this.clinic.findPet(petId); Visit visit = new Visit(); pet.addVisit(visit); model.addAttribute("visit", visit); diff --git a/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java b/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java index fa9f092c1..d624e4dc8 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/ClinicController.java @@ -71,7 +71,7 @@ public class ClinicController { @RequestMapping("/owners/{ownerId}") public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { ModelAndView mav = new ModelAndView("owners/show"); - mav.addObject(this.clinic.loadOwner(ownerId)); + mav.addObject(this.clinic.findOwner(ownerId)); return mav; } @@ -84,7 +84,7 @@ public class ClinicController { @RequestMapping(value="/owners/*/pets/{petId}/visits", method=RequestMethod.GET) public ModelAndView visitsHandler(@PathVariable int petId) { ModelAndView mav = new ModelAndView("visits"); - mav.addObject("visits", this.clinic.loadPet(petId).getVisits()); + mav.addObject("visits", this.clinic.findPet(petId).getVisits()); return mav; } diff --git a/src/main/java/org/springframework/samples/petclinic/web/EditOwnerController.java b/src/main/java/org/springframework/samples/petclinic/web/EditOwnerController.java index e602f75fd..5c830181d 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/EditOwnerController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/EditOwnerController.java @@ -44,7 +44,7 @@ public class EditOwnerController { @RequestMapping(method = RequestMethod.GET) public String setupForm(@PathVariable("ownerId") int ownerId, Model model) { - Owner owner = this.clinic.loadOwner(ownerId); + Owner owner = this.clinic.findOwner(ownerId); model.addAttribute(owner); return "owners/form"; } diff --git a/src/main/java/org/springframework/samples/petclinic/web/EditPetController.java b/src/main/java/org/springframework/samples/petclinic/web/EditPetController.java index c7703c1e9..129f078fa 100644 --- a/src/main/java/org/springframework/samples/petclinic/web/EditPetController.java +++ b/src/main/java/org/springframework/samples/petclinic/web/EditPetController.java @@ -52,7 +52,7 @@ public class EditPetController { @RequestMapping(method = RequestMethod.GET) public String setupForm(@PathVariable("petId") int petId, Model model) { - Pet pet = this.clinic.loadPet(petId); + Pet pet = this.clinic.findPet(petId); model.addAttribute("pet", pet); return "pets/form"; } @@ -72,7 +72,7 @@ public class EditPetController { @RequestMapping(method = RequestMethod.DELETE) public String deletePet(@PathVariable int petId) { - Pet pet = this.clinic.loadPet(petId); + Pet pet = this.clinic.findPet(petId); this.clinic.deletePet(petId); return "redirect:/owners/" + pet.getOwner().getId(); } diff --git a/src/main/resources/db/hsqldb/initDB.txt b/src/main/resources/db/hsqldb/initDB.sql similarity index 100% rename from src/main/resources/db/hsqldb/initDB.txt rename to src/main/resources/db/hsqldb/initDB.sql diff --git a/src/main/resources/db/hsqldb/populateDB.txt b/src/main/resources/db/hsqldb/populateDB.sql similarity index 100% rename from src/main/resources/db/hsqldb/populateDB.txt rename to src/main/resources/db/hsqldb/populateDB.sql diff --git a/src/main/webapp/WEB-INF/spring/applicationContext-dataSource.xml b/src/main/resources/spring/applicationContext-dataSource.xml similarity index 94% rename from src/main/webapp/WEB-INF/spring/applicationContext-dataSource.xml rename to src/main/resources/spring/applicationContext-dataSource.xml index 395885883..d803c0a2f 100644 --- a/src/main/webapp/WEB-INF/spring/applicationContext-dataSource.xml +++ b/src/main/resources/spring/applicationContext-dataSource.xml @@ -15,7 +15,7 @@ - + - - - + - - - - + p:database="${jpa.database}" p:showSql="${jpa.showSql}"/> + + + + org/springframework/samples/petclinic + - diff --git a/src/main/resources/jdbc.properties b/src/main/resources/spring/jdbc.properties similarity index 95% rename from src/main/resources/jdbc.properties rename to src/main/resources/spring/jdbc.properties index 82cd2ead2..5d6b55861 100644 --- a/src/main/resources/jdbc.properties +++ b/src/main/resources/spring/jdbc.properties @@ -22,8 +22,8 @@ jdbc.username=sa jdbc.password= # Properties that control the population of schema and data for a new data source -jdbc.initLocation=classpath:db/hsqldb/initDB.txt -jdbc.dataLocation=classpath:db/hsqldb/populateDB.txt +jdbc.initLocation=classpath:db/hsqldb/initDB.sql +jdbc.dataLocation=classpath:db/hsqldb/populateDB.sql # Property that determines which Hibernate dialect to use # (only applied with "applicationContext-hibernate.xml") diff --git a/src/main/webapp/WEB-INF/spring/applicationContext-hibernate.xml b/src/main/webapp/WEB-INF/spring/applicationContext-hibernate.xml deleted file mode 100644 index 4e155d5ba..000000000 --- a/src/main/webapp/WEB-INF/spring/applicationContext-hibernate.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - ${hibernate.dialect} - ${hibernate.show_sql} - ${hibernate.generate_statistics} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 43c322bd5..b8dad078f 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -37,7 +37,7 @@ --> contextConfigLocation - /WEB-INF/spring/applicationContext-jdbc.xml + classpath:spring/applicationContext-jdbc.xml