r433 - in jpa2-validation/trunk: . jsr303-validation jsr317-jpa2 jsr317-jpa2/src jsr317-jpa2/src/main jsr317-jpa2/src/main/java jsr317-jpa2/src/main/java/org jsr317-jpa2/src/main/java/org/nuiton jsr317-jpa2/src/main/java/org/nuiton/sandbox jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317 jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2 jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence jsr317-jpa2/
Author: fdesbois Date: 2010-11-12 18:53:20 +0100 (Fri, 12 Nov 2010) New Revision: 433 Url: http://nuiton.org/repositories/revision/sandbox/433 Log: Add customer test for jpa2 using Spring for IoC and Hibernate as implementation : simple copy of some classes from current project where I worked to keep consistance trace. Added: jpa2-validation/trunk/jsr317-jpa2/src/ jpa2-validation/trunk/jsr317-jpa2/src/main/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCode.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCodeImpl.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Address.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AddressImpl.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntity.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntityImpl.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Customer.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/CustomerImpl.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AccessCodeCreator.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AddressCreator.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAO.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImpl.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAO.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImpl.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfig.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfigSource.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaHelper.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/Search.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/SearchImpl.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/UpdateTechnicalFieldListener.java jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/sample/ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/sample/DataSampleProvider.java jpa2-validation/trunk/jsr317-jpa2/src/main/resources/ jpa2-validation/trunk/jsr317-jpa2/src/main/resources/jsr317-spring-context.xml jpa2-validation/trunk/jsr317-jpa2/src/test/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/entity/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImplTest.java jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImplTest.java jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/AddressFake.java jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/BaseTest.java jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/JpaConfigTestSource.java jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/SpringTestConfig.java jpa2-validation/trunk/jsr317-jpa2/src/test/resources/ jpa2-validation/trunk/jsr317-jpa2/src/test/resources/META-INF/ jpa2-validation/trunk/jsr317-jpa2/src/test/resources/META-INF/persistence.xml jpa2-validation/trunk/jsr317-jpa2/src/test/resources/jdbc-test.properties jpa2-validation/trunk/jsr317-jpa2/src/test/resources/log4j.properties jpa2-validation/trunk/jsr317-jpa2/src/test/resources/test-context.xml Modified: jpa2-validation/trunk/LICENSE.txt jpa2-validation/trunk/README.txt jpa2-validation/trunk/changelog.txt jpa2-validation/trunk/jsr303-validation/LICENSE.txt jpa2-validation/trunk/jsr303-validation/README.txt jpa2-validation/trunk/jsr303-validation/changelog.txt jpa2-validation/trunk/jsr303-validation/pom.xml jpa2-validation/trunk/jsr317-jpa2/LICENSE.txt jpa2-validation/trunk/jsr317-jpa2/README.txt jpa2-validation/trunk/jsr317-jpa2/changelog.txt jpa2-validation/trunk/jsr317-jpa2/pom.xml jpa2-validation/trunk/pom.xml Property changes on: jpa2-validation/trunk/LICENSE.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/README.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/changelog.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/jsr303-validation/LICENSE.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/jsr303-validation/README.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/jsr303-validation/changelog.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/jsr303-validation/pom.xml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/jsr317-jpa2/LICENSE.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/jsr317-jpa2/README.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Property changes on: jpa2-validation/trunk/jsr317-jpa2/changelog.txt ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: jpa2-validation/trunk/jsr317-jpa2/pom.xml =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/pom.xml 2010-11-05 12:45:44 UTC (rev 432) +++ jpa2-validation/trunk/jsr317-jpa2/pom.xml 2010-11-12 17:53:20 UTC (rev 433) @@ -1,4 +1,5 @@ -<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/maven-v4_0_0.xsd"> +<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> @@ -16,11 +17,93 @@ <dependencies> + <!--<dependency>--> + <!--<groupId>org.nuiton</groupId>--> + <!--<artifactId>nuiton-utils</artifactId>--> + <!--<version>1.4.2</version>--> + <!--</dependency>--> + + <!-- SPRING --> <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> + <groupId>org.springframework</groupId> + <artifactId>spring-orm</artifactId> </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-jdbc</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-tx</artifactId> + </dependency> + + <!-- JPA : JSR-317- --> + <dependency> + <groupId>org.hibernate.javax.persistence</groupId> + <artifactId>hibernate-jpa-2.0-api</artifactId> + </dependency> + + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + </dependency> + + <!-- LOGGING --> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + </dependency> + + <!-- TESTS --> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> + + <!-- Hibernate implementation used for tests --> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-entitymanager</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </dependency> + + <!-- Testing --> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + </dependency> + </dependencies> <!-- ************************************************************* --> @@ -31,13 +114,13 @@ <description>JPA2 tests</description> <inceptionYear>2010</inceptionYear> <url>http://maven-site.nuiton.org/${project.artifactId}</url> - + <!-- ************************************************************* --> <!-- *** Build Settings ****************************************** --> <!-- ************************************************************* --> <packaging>jar</packaging> - + <build> <resources> @@ -50,14 +133,70 @@ </resource> </resources> + + <!-- Configuration to generate metamodel : ref = http://docs.jboss.org/hibernate/jpamodelgen/1.0/reference/en-US/html_single/... --> + <plugins> + + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <!--<compilerArguments>--> + <!--<!– Generate Jpa MetaModel –>--> + <!--<processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor>--> + <!--</compilerArguments>--> + <compilerArgument>-proc:none</compilerArgument> + </configuration> + </plugin> + + <plugin> + <groupId>org.bsc.maven</groupId> + <artifactId>maven-processor-plugin</artifactId> + <executions> + <execution> + <id>process</id> + <goals> + <goal>process</goal> + </goals> + <phase>generate-sources</phase> + <configuration> + <compilerArguments>-Adebug=TRUE</compilerArguments> + <!-- source output directory --> + <outputDirectory>${maven.gen.dir}/java</outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <id>add-source</id> + <phase>generate-sources</phase> + <goals> + <goal>add-source</goal> + </goals> + <configuration> + <sources> + <source>${maven.gen.dir}/java</source> + </sources> + </configuration> + </execution> + </executions> + </plugin> + + </plugins> + </build> <!-- Source control management. --> <scm> <connection>scm:svn:http://svn.nuiton.org/svn/sandbox/jpa2-validation/trunk/jsr317-jpa2</connection> - <developerConnection>scm:svn:http://svn.nuiton.org/svn/sandbox/jpa2-validation/trunk/jsr317-jpa2</developerConnection> + <developerConnection>scm:svn:http://svn.nuiton.org/svn/sandbox/jpa2-validation/trunk/jsr317-jpa2 + </developerConnection> <url>http://www.nuiton.org/repositories/browse/sandbox/jpa2-validation/trunk/jsr317-jpa2</url> </scm> - + </project> Property changes on: jpa2-validation/trunk/jsr317-jpa2/pom.xml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCode.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCode.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCode.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,28 @@ +/** + * + */ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +import java.io.Serializable; + +/** + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface AccessCode extends Serializable { + + String PROPERTY_LOGIN = "login"; + + String PROPERTY_PASSWORD = "password"; + + /** + * @param login the login to set + */ + public void setLogin(String login); + + /** + * @param password the password to set + */ + public void setPassword(String password); + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCode.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCodeImpl.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCodeImpl.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCodeImpl.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,51 @@ +/** + * + */ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +import javax.persistence.Embeddable; + +/** + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Embeddable +public class AccessCodeImpl implements AccessCode { + + public static final long serialVersionUID = 1L; + + /** + * the login + */ + private String login; + + /** + * the password + */ + private String password; + + /** + * @param login the login to set + */ + @Override + public void setLogin(String login) { + this.login = login; + } + + public String getLogin() { + return login; + } + + /** + * @param password the password to set + */ + @Override + public void setPassword(String password) { + this.password = password; + } + + public String getPassword() { + return password; + } + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AccessCodeImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Address.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Address.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Address.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,74 @@ +/** + * + */ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +import java.io.Serializable; + +/** + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface Address extends Serializable { + + String PROPERTY_STREET = "street"; + + String PROPERTY_STREET_2 = "street2"; + + String PROPERTY_ZIP_CODE = "zipCode"; + + String PROPERTY_TOWN = "town"; + + String PROPERTY_COUNTRY = "country"; + + /** + * @return the street + */ + public String getStreet(); + + /** + * @param street the street to set + */ + public void setStreet(String street); + + /** + * @return the street2 + */ + public String getStreet2(); + + /** + * @param street2 the street2 to set + */ + public void setStreet2(String street2); + + /** + * @return the zipCode + */ + public String getZipCode(); + + /** + * @param zipCode the zipCode to set + */ + public void setZipCode(String zipCode); + + /** + * @return the town + */ + public String getTown(); + + /** + * @param town the town to set + */ + public void setTown(String town); + + /** + * @return the country + */ + public String getCountry(); + + /** + * @param country the country to set + */ + public void setCountry(String country); + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Address.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AddressImpl.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AddressImpl.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AddressImpl.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,128 @@ +/** + * + */ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +import javax.persistence.Embeddable; + +/** + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Embeddable +public class AddressImpl implements Address { + + public static final long serialVersionUID = 1L; + + /** + * the street + */ + private String street; + + /** + * the street complement + */ + private String street2; + + /** + * the zip code + */ + private String zipCode; + + /** + * the town + */ + private String town; + + /** + * the country + */ + private String country; + + /** + * Default constructor: constructs an empty address + */ + public AddressImpl(){ + } + + /** + * @return the street + */ + @Override + public String getStreet() { + return street; + } + + /** + * @param street the street to set + */ + @Override + public void setStreet(String street) { + this.street = street; + } + + /** + * @return the street2 + */ + @Override + public String getStreet2() { + return street2; + } + + /** + * @param street2 the street2 to set + */ + @Override + public void setStreet2(String street2) { + this.street2 = street2; + } + + /** + * @return the zipCode + */ + @Override + public String getZipCode() { + return zipCode; + } + + /** + * @param zipCode the zipCode to set + */ + @Override + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } + + /** + * @return the town + */ + @Override + public String getTown() { + return town; + } + + /** + * @param town the town to set + */ + @Override + public void setTown(String town) { + this.town = town; + } + + /** + * @return the country + */ + @Override + public String getCountry() { + return country; + } + + /** + * @param country the country to set + */ + @Override + public void setCountry(String country) { + this.country = country; + } + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/AddressImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntity.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntity.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntity.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,51 @@ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * Created on 18 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface BaseEntity extends Serializable { + + String PROPERTY_ID = "id"; + + String PROPERTY_VERSION = "version"; + + String PROPERTY_UPDATE_DATE = "updateDate"; + + String PROPERTY_CREATE_DATE = "createDate"; + + /** + * Id of the entity + * + * @return the id of the entity. + */ + Long getId(); + + void setId(Long id); + + /** + * Version of the entity, i.e, the number of time it was modified. + * + * @return the id of the entity. + */ + int getVersion(); + + /** + * Last date when entity was updated. + * + * @return the update date of the entity. + */ + Date getUpdateDate(); + + /** + * Date when entity was created. + * + * @return the create date of the entity. + */ + Date getCreateDate(); +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntity.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntityImpl.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntityImpl.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntityImpl.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,73 @@ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +import javax.persistence.EntityListeners; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Version; +import java.util.Date; +import org.nuiton.sandbox.jsr317.jpa2.persistence.UpdateTechnicalFieldListener; + +/** + * Created on 18 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@MappedSuperclass +@EntityListeners(UpdateTechnicalFieldListener.class) +public abstract class BaseEntityImpl implements BaseEntity { + + private Long id; + + private int version; + + private Date createDate; + + private Date updateDate; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Override + public Long getId() { + return id; + } + + @Override + public void setId(Long id) { + this.id = id; + } + + @Version + @Override + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + + @Temporal(TemporalType.DATE) + @Override + public Date getCreateDate() { + return createDate; + } + + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + + @Temporal(TemporalType.DATE) + @Override + public Date getUpdateDate() { + return updateDate; + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/BaseEntityImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Customer.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Customer.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Customer.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,95 @@ +/** + * + */ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +/** + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface Customer extends BaseEntity { + + String PROPERTY_FIRST_NAME = "firstName"; + + String PROPERTY_LAST_NAME = "lastName"; + + String PROPERTY_ADDRESS = "address"; + + String PROPERTY_PHONE = "phone"; + + String PROPERTY_CELLPHONE = "cellphone"; + + String PROPERTY_EMAIL = "email"; + + String PROPERTY_ACCESS_CODE = "accessCode"; + + /** + * @return the firstName + */ + public String getFirstName() ; + + /** + * @param firstName the firstName to set + */ + public void setFirstName(String firstName); + + /** + * @return the lastName + */ + public String getLastName(); + + /** + * @param lastName the lastName to set + */ + public void setLastName(String lastName); + + /** + * @return the address + */ + public Address getAddress(); + + /** + * @param address the address to set + */ + public void setAddress(Address address); + + /** + * @return the phone + */ + public String getPhone() ; + + /** + * @param phone the phone to set + */ + public void setPhone(String phone) ; + + /** + * @return the cellphone + */ + public String getCellphone() ; + + /** + * @param cellphone the cellphone to set + */ + public void setCellphone(String cellphone) ; + + /** + * @return the email + */ + public String getEmail(); + + /** + * @param email the email to set + */ + public void setEmail(String email) ; + + /** + * @return the accessCode + */ + public AccessCode getAccessCode(); + + /** + * @param accessCode the accessCode to set + */ + public void setAccessCode(AccessCode accessCode) ; +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/Customer.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/CustomerImpl.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/CustomerImpl.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/CustomerImpl.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,176 @@ +/** + * + */ +package org.nuiton.sandbox.jsr317.jpa2.entity; + +import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.Table; +import org.nuiton.sandbox.jsr317.jpa2.persistence.JpaHelper; + +/** + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Entity +@Table(name = "CUSTOMER") +public class CustomerImpl extends BaseEntityImpl implements Customer { + + public static final long serialVersionUID = 1L; + + /** + * the firstName + */ + private String firstName; + + /** + * the lastName + */ + private String lastName; + + /** + * the address + */ + private Address address; + + /** + * the phone number + */ + private String phone; + + /** + * the cellphone number + */ + private String cellphone; + + /** + * the email address + */ + private String email; + + /** + * the customer's access code + */ + private AccessCode accessCode; + + /** + * Default constructor : constructs an empty Customer + */ + public CustomerImpl() { + } + + /** + * @return the firstname + */ + @Override + public String getFirstName() { + return firstName; + } + + /** + * @param firstName the firstName to set + */ + @Override + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + /** + * @return the lastname + */ + @Override + public String getLastName() { + return lastName; + } + + /** + * @param lastName the lastName to set + */ + @Override + public void setLastName(String lastName) { + this.lastName = lastName; + } + + /** + * @return the address + */ + @Embedded + @Override + public AddressImpl getAddress() { + return JpaHelper.safeEmbeddableCast(address, AddressImpl.class); + } + + /** + * @param address the address to set + */ + @Override + public void setAddress(Address address) { + this.address = address; + } + + /** + * @return the phone + */ + @Override + public String getPhone() { + return phone; + } + + /** + * @param phone the phone to set + */ + @Override + public void setPhone(String phone) { + this.phone = phone; + } + + /** + * @return the cellphone + */ + @Override + public String getCellphone() { + return cellphone; + } + + /** + * @param cellphone the cellphone to set + */ + @Override + public void setCellphone(String cellphone) { + this.cellphone = cellphone; + } + + /** + * @return the email + */ + @Override + public String getEmail() { + return email; + } + + /** + * @param email the email to set + */ + @Override + public void setEmail(String email) { + this.email = email; + } + + /** + * @return the accessCode + */ + @Embedded + @Override + public AccessCodeImpl getAccessCode() { + return JpaHelper.safeEmbeddableCast(accessCode, AccessCodeImpl.class); + } + + /** + * @param accessCode the accessCode to set + */ + @Override + public void setAccessCode(AccessCode accessCode) { + this.accessCode = accessCode; + } + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/entity/CustomerImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AccessCodeCreator.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AccessCodeCreator.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AccessCodeCreator.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,17 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import org.nuiton.sandbox.jsr317.jpa2.entity.AccessCode; + +/** + * Created on 22 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface AccessCodeCreator { + + /** + * @return a new instance of AccessCode used to be set in different elements related to DAO. + */ + AccessCode newInstanceAccessCode(); +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AccessCodeCreator.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AddressCreator.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AddressCreator.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AddressCreator.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,17 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import org.nuiton.sandbox.jsr317.jpa2.entity.Address; + +/** + * Created on 22 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface AddressCreator { + + /** + * @return a new instance of Address used to be set in different elements related to DAO. + */ + Address newInstanceAddress(); +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/AddressCreator.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAO.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAO.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAO.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,94 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import javax.persistence.EntityManager; +import java.io.Serializable; +import java.util.List; + +/** + * BaseDAO is the interface to be used by all DAO. + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + * @param <E> the type of data + * @param <K> the key of data + */ +public interface BaseDAO<E, K extends Serializable> { + + /** + * Return a new instance of the entity. + * + * @return a new instance of the entity + */ + E newInstance(); + + /** + * Create the {@code element}, i.e, persist it. The {@code element} need to be instantiated using {@link #newInstance()}. + * + * @param element the object to create. + * @see EntityManager#persist(Object) + */ + void create(E element); + + /** + * Update the {@code element}. If element is not present in session, it will be retrieved from database and attached to it. The update + * is directly executed (flushed) to have proper data in resulting object. + * + * @param element the object to update + * @return the object updated attached to the session + * @see EntityManager#merge(Object) + */ + E update(E element); + + /** + * Save the {@code element} will create it if no id is defined or update it otherwise. Updated or created element will be returned as result. + * + * @param element Element to save + * @return the element saved this way + */ + E save(E element); + + /** + * Remove the {@code element}. The reference is still available after removal but the next read will return a null value using the element id. + * + * @param element the object to remove + */ + void delete(E element); + + /** + * Read an element using it's {@code id}. + * + * @param id Id of the element to read + * @return the element if found or null otherwise + */ + E read(K id); + + /** + * Return a list of all existing elements + * + * @return a list of all elements (never null) + */ + List<E> readAll(); + + /** + * Return the number of existing elements. + * + * @return the number of existing elements + */ + int count(); + + /** + * Clear the current session. Needed after some error occurs. + */ + void clearSession(); + + /** + * Flush the current session. Needed to manually commit the session. + */ + void flushSession(); + + /** + * Delete all existing elements of E type + */ + void deleteAll(); + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAO.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImpl.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImpl.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImpl.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,356 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import javax.persistence.EntityManager; +import javax.persistence.NoResultException; +import javax.persistence.NonUniqueResultException; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Root; +import java.io.Serializable; +import java.util.List; +import org.nuiton.sandbox.jsr317.jpa2.entity.BaseEntity; +import org.nuiton.sandbox.jsr317.jpa2.entity.BaseEntityImpl; + +/** + * This class provides basic CRUD mechanism. + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + * @param <C> the Entity contract (interface) + * @param <E> the Entity class for JPA + */ +public abstract class BaseDAOImpl<C extends BaseEntity, E extends BaseEntityImpl, K extends Serializable> implements BaseDAO<C, K> { + + public enum SaveStrategy { + PERSIST(true, false), PERSIST_FLUSH(true, true), MERGE(false, false), MERGE_FLUSH(false, true); + + boolean flush; + + boolean persist; + + SaveStrategy(boolean persist, boolean flush) { + this.flush = flush; + this.persist = persist; + } + + public boolean isFlush() { + return flush; + } + + public boolean isPersist() { + return persist; + } + } + + protected abstract class QueryWrapper<E extends BaseEntity, R> { + + protected CriteriaBuilder builder; + + protected CriteriaQuery<R> criteria; + + protected Root<E> root; + + protected TypedQuery<R> query; + + public Root<E> root() { + if (root == null) { + root = criteria().from(entityClass()); + } + return root; + } + + public CriteriaQuery<R> criteria() { + if (criteria == null) { + criteria = builder().createQuery(resultClass()); + } + return criteria; + } + + public CriteriaBuilder builder() { + if (builder == null) { + builder = em.getCriteriaBuilder(); + } + return builder; + } + + public TypedQuery<R> computeCriteria() { + return em.createQuery(criteria); + } + + public TypedQuery<R> query() { + if (query == null) { + query = computeCriteria(); + } + return query; + } + + public <T> void whereEqual(Path<? extends T> propertyPath, T value) { + criteria().where( + builder().equal( + propertyPath, + value + ) + ); + } + + public <T> void whereEqual(String property, T value) { + whereEqual(root().<T>get(property), value); + } + + @SuppressWarnings({"unchecked"}) + protected Class<E> entityClass() { + // Use entityClass defined in DAO + return (Class<E>) getEntityClass(); + } + + protected abstract Class<R> resultClass(); + + } + + protected class BaseQueryWrapper<C extends BaseEntity, E extends BaseEntityImpl> extends QueryWrapper<E, E> { + + @Override + protected Class<E> resultClass() { + return entityClass(); + } + + @SuppressWarnings({"unchecked"}) + public List<C> listResult() { + List<E> results = query().getResultList(); + return (List<C>) results; + } + + @SuppressWarnings({"unchecked"}) + public C singleResult() throws NonUniqueResultException, NoResultException { + E result = query().getSingleResult(); + return (C) result; + } + } + + protected class CountQueryWrapper<E extends BaseEntity> extends QueryWrapper<E, Long> { + + public int count() { + criteria().select(builder.count(root())); + return executeCount(); + } + + public int countDistinct() { + criteria().select(builder.countDistinct(root())); + return executeCount(); + } + + protected int executeCount() { + // Create the query and retrieve the single result corresponding to the count value + TypedQuery<Long> query = computeCriteria(); + return query.getSingleResult().intValue(); + } + + @Override + protected Class<Long> resultClass() { + return Long.class; + } + } + + /** + * Memorizes the Entity Class. + */ + private Class<E> entityClass; + + /** + * Private EntityManager through Hibernate implementation. + */ + @PersistenceContext + protected EntityManager em; + + /** + * The SaveStrategy defined how the save method should be executed, look at {@link #save(BaseEntity)} implementation + */ + protected SaveStrategy saveStrategy; + + /** + * Constructor to be called by siblings. + */ + public BaseDAOImpl() { + entityClass = getEntityClass(); + saveStrategy = SaveStrategy.PERSIST; + } + + public SaveStrategy getSaveStrategy() { + return saveStrategy; + } + + public void setSaveStrategy(SaveStrategy saveStrategy) { + this.saveStrategy = saveStrategy; + } + + /** + * {@inheritDoc} + */ + @Override + public void create(C element) { + em.persist(element); + } + + /** + * {@inheritDoc} + */ + @Override + public C update(C entity) { + C result = em.merge(entity); + em.flush(); + return result; + } + + /** + * Save depends on {@link #saveStrategy} defined. By default, it's the {@link SaveStrategy#PERSIST_FLUSH} one. + */ + @Override + public C save(C element) { + // Keep instance by default + C result = element; + + // Type of save, if persist the element need to be in session for an update + if (saveStrategy.isPersist()) { + em.persist(element); + } else { + result = em.merge(element); + } + + // Explicit flush + if (saveStrategy.isFlush()) { + em.flush(); + } + + return result; + } + + /** + * {@inheritDoc} + */ + @Override + public void delete(final C entity) { + if (entity != null) { + em.remove(entity); + } + } + + /** + * {@inheritDoc} + */ + @SuppressWarnings({"unchecked"}) + @Override + public C read(final K id) { + if (id == null) { + return null; + } + return (C) em.find(entityClass, id); + } + + /** + * {@inheritDoc} + */ + @Override + public List<C> readAll() { + + BaseQueryWrapper<C, E> query = new BaseQueryWrapper<C, E>(); + + query.criteria().select(query.root()); + + List<C> results = query.listResult(); + + return results; + } + + protected List<C> readAllByProperty(String property, Object value) { + + BaseQueryWrapper<C, E> query = new BaseQueryWrapper<C, E>(); + + query.whereEqual(property, value); + + List<C> results = query.listResult(); + + return results; + } + + @SuppressWarnings({"unchecked"}) + protected List<C> readAllByQuery(TypedQuery<E> query) { + List<E> results = query.getResultList(); + return (List<C>) results; + } + + /** + * {@inheritDoc} + */ + @Override + public int count() { + CountQueryWrapper<E> query = new CountQueryWrapper<E>(); + + return query.count(); + } + + /** + * Read first resulting entity from an input {@code query}. + * + * @param query Input query + * @return the resulting first entity + */ + protected static <T> T readFirst(TypedQuery<T> query) { + List<T> resultList = query.getResultList(); + if (!resultList.isEmpty()) { + return resultList.get(0); + } else { + return null; + } + } + + @Override + public void clearSession() { + em.clear(); + } + + @Override + public void flushSession() { + em.flush(); + } + + @Override + public void deleteAll() { + List<C> elements = readAll(); + for (C element : elements) { + delete(element); + } + } + + /** + * Set the limit of the {@code query} depends on {@code search} parameters. + * + * @param query Query to add limit parameters + * @param search Search containing limit parameters + */ + protected void setSearchLimit(TypedQuery<?> query, Search search) { + int start = 0; + if (search.getStartIndex() != null) { + start = search.getStartIndex(); + query.setFirstResult(start); + } + + if (search.getEndIndex() != null) { + query.setMaxResults(search.getEndIndex() - start + 1); + } + } + + /** + * {@inheritDoc} + */ + @Override + public abstract C newInstance(); + + /** + * @return the entityClass to manipulate as persistent object (defined in mapping). + */ + protected abstract Class<E> getEntityClass(); + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAO.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAO.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAO.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,12 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import org.nuiton.sandbox.jsr317.jpa2.entity.Customer; + +/** + * Created on 22 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface CustomerDAO extends BaseDAO<Customer, Long>, AddressCreator, AccessCodeCreator { +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAO.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImpl.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImpl.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImpl.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,39 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import org.nuiton.sandbox.jsr317.jpa2.entity.AccessCode; +import org.nuiton.sandbox.jsr317.jpa2.entity.AccessCodeImpl; +import org.nuiton.sandbox.jsr317.jpa2.entity.Address; +import org.nuiton.sandbox.jsr317.jpa2.entity.AddressImpl; +import org.nuiton.sandbox.jsr317.jpa2.entity.Customer; +import org.nuiton.sandbox.jsr317.jpa2.entity.CustomerImpl; +import org.springframework.stereotype.Repository; + +/** + * Created on 22 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Repository +public class CustomerDAOImpl extends BaseDAOImpl<Customer, CustomerImpl, Long> implements CustomerDAO { + + @Override + public Customer newInstance() { + return new CustomerImpl(); + } + + @Override + protected Class<CustomerImpl> getEntityClass() { + return CustomerImpl.class; + } + + @Override + public Address newInstanceAddress() { + return new AddressImpl(); + } + + @Override + public AccessCode newInstanceAccessCode() { + return new AccessCodeImpl(); + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfig.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfig.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfig.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,79 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import javax.persistence.EntityManagerFactory; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; +import org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver; +import org.springframework.instrument.classloading.LoadTimeWeaver; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; + +/** + * Created on 21 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Configuration +@ImportResource("classpath:/jsr317-spring-context.xml") +public class JpaConfig { + + private static final Log log = LogFactory.getLog(JpaConfig.class); + + @Autowired + private JpaConfigSource configSource; + + /** + * Create bean transactionManager used for injection of EntityManager. Need EntityManagerFactory bean provided by + * {@link #entityManagerFactory()}. + * + * @return the JpaTransactionManager used for Jpa transactions in EntityManager + */ + @Bean + public JpaTransactionManager transactionManager() { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(entityManagerFactory()); + return transactionManager; + } + + /** + * Create bean entityManagerFactory used by transactionManager. The factory is created using + * {@link LocalContainerEntityManagerFactoryBean}. {@link JpaConfigSource} implementation is needed to provide + * parameters for the BeanFactory. The FactoryBean is directly used to provide EntityManagerFactory as object + * returned by this method. + * + * @return the EntityManagerFactory constructed by a BeanFactory provided by Spring. + * @see JpaConfigSource + */ + @Bean + public EntityManagerFactory entityManagerFactory() { + LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); + + if (log.isDebugEnabled()) { + log.debug("new LocalContainerEntityManagerFactoryBean()"); + } + + // DataSource to specify Database connection + factoryBean.setDataSource(configSource.dataSource()); + + // Extra VendorAdapter + factoryBean.setJpaVendorAdapter(configSource.jpaVendorAdapter()); + + // Extra JPA properties + factoryBean.setJpaProperties(configSource.jpaProperties()); + + // Instrumentation + LoadTimeWeaver loadTimeWeaver = new InstrumentationLoadTimeWeaver(); + factoryBean.setLoadTimeWeaver(loadTimeWeaver); + + // Ensure properties for the EntityManagerFactory object + factoryBean.afterPropertiesSet(); + + return factoryBean.getObject(); + } + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfig.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfigSource.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfigSource.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfigSource.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,44 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import javax.sql.DataSource; +import java.util.Properties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.JpaVendorAdapter; + +/** + * Defined ConfigSource used for Jpa configuration. This will provide parameters to configure the Jpa connection that + * depends from implementation. Jpa will not work until some implementation implement this contract. + * <p /> + * Created on 21 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Configuration +public interface JpaConfigSource { + + /** + * DataSource to use to configure connection with database. + * + * @return the DataSource to used in EntityManagerFactory as database connection. + */ + @Bean + DataSource dataSource(); + + /** + * Additional properties from Vendor implementation of JPA. + * + * @return the JpaVendorAdapter to used in EntityManagerFactory + */ + @Bean + JpaVendorAdapter jpaVendorAdapter(); + + /** + * Additional Jpa properties. + * + * @return the Properties to set directly as Jpa Properties in EntityManagerFactory + */ + @Bean + Properties jpaProperties(); +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaConfigSource.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaHelper.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaHelper.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaHelper.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,50 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import javax.persistence.Embeddable; + +/** + * Created on 25 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public class JpaHelper { + + /** + * Util method to check embeddable assignment from an {@code inputInstance} to an {@code embeddableImplClass}. + * JPA doesn't provide property or annotation to use other target as attribute type for Embedded classes. In our case, we use + * only interfaces for all objects, so as Embedded ones. It's better to call this method before each manual cast to Embedded object + * in setter methods because the declaration need to be of implementation type. This method resulting a safe cast to correct + * implementation class for Embeddable objects. + * + * @param inputInstance Input type to check + * @param embeddableImplClass Embeddable instance with {@link Embeddable} annotation + * @return the correct embeddable type to use for persistence support + * @throws ClassCastException Exception thrown if inputInstance doesn't correspond to implementation class + * @throws IllegalArgumentException Exception thrown if embeddable implementation class doesn't have Embeddable annotation + */ + public static <T> T safeEmbeddableCast(Object inputInstance, Class<T> embeddableImplClass) + throws ClassCastException, IllegalArgumentException { + + if (inputInstance == null) { + return null; + } + + if (!embeddableImplClass.isAnnotationPresent(Embeddable.class)) { + throw new IllegalArgumentException(String.format( + "Embeddable implementation '%s' doesn't have correct @Embeddable annotation", + embeddableImplClass.getName() + )); + } + + if (!inputInstance.getClass().isAssignableFrom(embeddableImplClass)) { + throw new ClassCastException(String.format( + "Unable to set element of type '%s', it is not supported as Embeddable instance '%s'", + inputInstance.getClass().getName(), + embeddableImplClass.getName() + )); + } + + return embeddableImplClass.cast(inputInstance); + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/JpaHelper.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/Search.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/Search.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/Search.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,26 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import java.io.Serializable; + +/** + * Created on 2 nov. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public interface Search extends Serializable { + + String getOrderBy(); + + void setOrderBy(String orderBy); + + Integer getStartIndex(); + + void setStartIndex(Integer startIndex); + + Integer getEndIndex(); + + /** @deprecated FIXME-fdesbois-2010-11-09 : criteria api need maxResults param so nbElementsByPage in PaginatedSearch */ + @Deprecated + void setEndIndex(Integer endIndex); +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/Search.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/SearchImpl.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/SearchImpl.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/SearchImpl.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,48 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +/** + * Created on 2 nov. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public class SearchImpl implements Search { + + public static final long serialVersionUID = 1L; + + private String orderBy; + + private Integer startIndex; + + private Integer endIndex; + + @Override + public String getOrderBy() { + return orderBy; + } + + @Override + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + + @Override + public Integer getStartIndex() { + return startIndex; + } + + @Override + public void setStartIndex(Integer startIndex) { + this.startIndex = startIndex; + } + + @Override + public Integer getEndIndex() { + return endIndex; + } + + @Override + public void setEndIndex(Integer endIndex) { + this.endIndex = endIndex; + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/SearchImpl.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/UpdateTechnicalFieldListener.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/UpdateTechnicalFieldListener.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/UpdateTechnicalFieldListener.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,59 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import javax.persistence.PrePersist; +import javax.persistence.PreUpdate; +import java.util.Date; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.sandbox.jsr317.jpa2.entity.BaseEntityImpl; + +/** + * + * Listener used to update technical fields such as {@code createDate}, {@code updateDate} + * and {@code version} defined in {@link BaseEntityImpl}. + * + * Created on 18 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public class UpdateTechnicalFieldListener { + + private static final Log log = LogFactory.getLog(UpdateTechnicalFieldListener.class); + + /** + * Callback to set updateDate and increment version on each entity update. + * + * @param entity Entity to update + */ + @PreUpdate + public void onPreUpdate(BaseEntityImpl entity) { + + // Update date + Date updateDate = new Date(); + entity.setUpdateDate(updateDate); + // Update version + int newVersion = entity.getVersion() + 1; + entity.setVersion(newVersion); + + if (log.isTraceEnabled()) { + log.trace("PreUpdate :: " + entity + " _ updateDate = " + updateDate + " _ version = " + newVersion); + } + } + + /** + * Callback to set createDate on each entity creation. + * + * @param entity Entity to update + */ + @PrePersist + public void onPrePersist(BaseEntityImpl entity) { + + Date createDate = new Date(); + entity.setCreateDate(createDate); + + if (log.isTraceEnabled()) { + log.trace("PrePersist :: " + entity + " _ createDate = " + createDate); + } + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/persistence/UpdateTechnicalFieldListener.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/sample/DataSampleProvider.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/sample/DataSampleProvider.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/sample/DataSampleProvider.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,108 @@ +package org.nuiton.sandbox.jsr317.jpa2.sample; + +import java.util.LinkedHashMap; +import java.util.Map; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.sandbox.jsr317.jpa2.entity.BaseEntity; +import org.nuiton.sandbox.jsr317.jpa2.entity.Customer; +import org.nuiton.sandbox.jsr317.jpa2.persistence.CustomerDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * Provider of data sample usefull for tests or having usable data in the database. Defined as a {@link Service} to be injected using Spring + * {@link Autowired} annotation. + * <p /> + * Created on 3 nov. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Service +public class DataSampleProvider { + + private static final Log logger = LogFactory.getLog(DataSampleProvider.class); + + /** + * Extension of {@link LinkedHashMap} with getter on index. Use {@link #get(int)} method to retrieve element at provided index. + * + * @param <K> Key type of the Map + * @param <O> Object type of the Map + */ + protected class IndexedMap<K, O extends BaseEntity> extends LinkedHashMap<K, O> { + + public O get(int index) { + int i = 0; + for (O o : values()) { + if (i == index) { + return o; + } + i++; + } + return null; + } + + @Override + public O put(K key, O value) { + if (logger.isTraceEnabled()) { + logger.trace("Add " + value.getClass().getSimpleName() + " with id = " + value.getId() + + " _ @" + Integer.toHexString(value.hashCode())); + } + return super.put(key, value); + } + } + + @Autowired + protected CustomerDAO customerDAO; + + protected IndexedMap<Long, Customer> customers = new IndexedMap<Long, Customer>(); + + public void createAllData() { + + if (logger.isDebugEnabled()) { + logger.debug("#### SAMPLE INSERT START ####"); + } + + createCustomers(); + + if (logger.isDebugEnabled()) { + logger.debug("#### SAMPLE INSERT FINISHED ####"); + } + } + + public void deleteAllData() { + + if (logger.isDebugEnabled()) { + logger.debug("#### SAMPLE DELETE START ####"); + } + + customerDAO.deleteAll(); + + if (logger.isDebugEnabled()) { + logger.debug("#### SAMPLE DELETE FINISHED ####"); + } + } + + // ---- CREATORS ---- // + + public void createCustomers() { + + if (logger.isDebugEnabled()) { + logger.debug("CREATE SAMPLE for " + Customer.class.getName()); + } + + customers.clear(); + } + + public Customer getCustomer(int index) { + if (customers.isEmpty()) { + createCustomers(); + } + return customers.get(index); + } + + public Map<Long, Customer> getCustomers() { + return customers; + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/java/org/nuiton/sandbox/jsr317/jpa2/sample/DataSampleProvider.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/main/resources/jsr317-spring-context.xml =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/main/resources/jsr317-spring-context.xml (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/main/resources/jsr317-spring-context.xml 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,14 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:tx="http://www.springframework.org/schema/tx" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + + + <!-- Component scanner for DAOS : detected from @Repository annotation --> + <context:component-scan base-package="org.nuiton.sandbox.jsr317.jpa2.persistence" /> + +</beans> \ No newline at end of file Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/main/resources/jsr317-spring-context.xml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImplTest.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImplTest.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImplTest.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,243 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.sandbox.jsr317.jpa2.entity.Customer; +import org.nuiton.sandbox.jsr317.jpa2.entity.CustomerImpl; +import org.nuiton.sandbox.jsr317.jpa2.persistence.BaseDAOImpl.SaveStrategy; +import org.nuiton.sandbox.jsr317.jpa2.test.BaseTest; +import org.springframework.transaction.annotation.Transactional; + +/** + * Test methods in BaseDAO. The CustomerDAO will be used as implementation of abstract class BaseDAOImpl. + * + * Created on 20 oct. 2010 + * + * @author fdesbois <florian.desbois@codelutin.com> + * @version $Id$ + */ +public class BaseDAOImplTest extends BaseTest { + + private static final Log log = LogFactory.getLog(BaseDAOImplTest.class); + + @Override + protected boolean autoDataEnabled() { + return true; + } + + @Test + @Transactional + public void testCreate() throws Exception { + + // ---- PREPARE DATA ---- // + Customer user = new CustomerImpl(); + user.setLastName("createLastName"); + user.setFirstName("createFirstName"); + + // ---- EXECUTE ---- // + log.info("CREATE user " + user); + userDAO.create(user); + log.debug("AFTER CREATE user " + user); + + // ---- CHECK DATA ---- // + Assert.assertNotNull(user.getId()); + Assert.assertNotNull(user.getCreateDate()); + Assert.assertNull(user.getUpdateDate()); + Assert.assertEquals(0, user.getVersion()); + + Customer userFound = em.find(CustomerImpl.class, user.getId()); + Assert.assertNotNull(userFound); + Assert.assertEquals("createLastName", userFound.getLastName()); + Assert.assertEquals("createFirstName", userFound.getFirstName()); + } + + @Test + @Transactional + public void testUpdate() throws Exception { + + // ---- PREPARE DATA ---- // + Customer user = new CustomerImpl(); + user.setLastName("updateLastName"); + user.setFirstName("updateFirstName"); + + em.persist(user); + em.flush(); + em.detach(user); + + // ---- EXECUTE ---- // + user.setLastName("nameUpdated"); + + log.info("UPDATE user " + user); + Customer userUpdated = userDAO.update(user); + log.debug("AFTER UPDATE user " + userUpdated); + + // ---- CHECK DATA ---- // + Assert.assertFalse(em.contains(user)); + Assert.assertTrue(em.contains(userUpdated)); + Assert.assertNotNull(userUpdated.getUpdateDate()); + Assert.assertEquals(1, userUpdated.getVersion()); + Assert.assertEquals("nameUpdated", userUpdated.getLastName()); + } + + @Test + @Transactional + public void testSave() throws Exception { + + // ---- PREPARE DATA ---- // + Customer user = new CustomerImpl(); + user.setLastName("saveLastName"); + user.setFirstName("saveFirstName"); + + // ---- EXECUTE ---- // + + BaseDAOImpl daoImpl = (BaseDAOImpl) userDAO; + + SaveStrategy strategy = daoImpl.getSaveStrategy(); + + // ## CREATE ## // + Customer userCreated = userDAO.save(user); + + if (!strategy.isPersist()) { + // Same as a create instead of returning the instance instead of modifying the input one + Assert.assertNotSame(user, userCreated); + } else { + Assert.assertEquals(user, userCreated); + } + + Assert.assertNotNull(userCreated.getId()); + Assert.assertNotNull(userCreated.getCreateDate()); + Assert.assertNull(userCreated.getUpdateDate()); + Assert.assertEquals(0, userCreated.getVersion()); + + // ## UPDATE ## // + userCreated.setLastName("updateLastName"); + Customer userUpdated = userDAO.save(userCreated); + + // Same instance because not detached from session + Assert.assertEquals(userUpdated, userCreated); + if (strategy.isFlush()) { + Assert.assertNotNull(userUpdated.getUpdateDate()); + Assert.assertEquals(1, userUpdated.getVersion()); + + } else { + Assert.assertNull(userUpdated.getUpdateDate()); + Assert.assertEquals(0, userUpdated.getVersion()); + // need explicit Flush + userDAO.flushSession(); + } + + // Other update no change, no version increment + Customer userUpdatedTwice = userDAO.save(userUpdated); + Assert.assertEquals(1, userUpdatedTwice.getVersion()); + } + + + @Test + @Transactional + public void testDelete() throws Exception { + + // ---- PREPARE DATA ---- // + Customer user = new CustomerImpl(); + user.setLastName("deleteLastName"); + user.setFirstName("deleteFirstName"); + + em.persist(user); + + // ---- EXECUTE ---- // + log.info("DELETE account " + user); + userDAO.delete(user); + log.debug("AFTER DELETE account " + user); + + // ---- CHECK DATA ---- // + Customer accountFound = em.find(CustomerImpl.class, user.getId()); + Assert.assertNull(accountFound); + } + + @Test + @Transactional + public void testRead() throws Exception { + + // ---- PREPARE DATA ---- // + Customer account = new CustomerImpl(); + account.setLastName("readLastName"); + account.setFirstName("readFirstName"); + + em.persist(account); + + // ---- EXECUTE ---- // + log.info("READ account " + account); + Customer accountFound = userDAO.read(account.getId()); + + // ---- CHECK DATA ---- // + Assert.assertNotNull(accountFound); + Assert.assertEquals("readLastName", accountFound.getLastName()); + } + + @Test + @Transactional + public void testReadAll() throws Exception { + + // ---- PREPARE DATA ---- // + Customer user1 = new CustomerImpl(); + user1.setLastName("readAllLastName1"); + user1.setFirstName("readAllFirstName1"); + + em.persist(user1); + + Customer user2 = new CustomerImpl(); + user2.setLastName("readAllLastName2"); + user2.setFirstName("readAllFirstName2"); + + em.persist(user2); + + // ---- EXECUTE ---- // + log.info("READ_ALL accounts"); + List<Customer> users = userDAO.readAll(); + + // ---- CHECK DATA ---- // + Assert.assertEquals(2, users.size()); + Assert.assertTrue(users.contains(user1)); + Assert.assertTrue(users.contains(user2)); + } + + @Test + @Transactional + public void testCount() throws Exception { + + // ---- PREPARE DATA ---- // + Customer user1 = new CustomerImpl(); + user1.setLastName("readAllLastName1"); + user1.setFirstName("readAllFirstName1"); + + em.persist(user1); + + Customer user2 = new CustomerImpl(); + user2.setLastName("readAllLastName2"); + user2.setFirstName("readAllFirstName2"); + + em.persist(user2); + + // ---- EXECUTE ---- // + log.info("COUNT accounts"); + int count = userDAO.count(); + + // ---- CHECK DATA ---- // + Assert.assertEquals(2, count); + } + + @Test + @Transactional + public void testNewInstance() throws Exception { + + // ---- EXECUTE ---- // + log.info("NEW_INSTANCE account"); + Customer user = userDAO.newInstance(); + + // ---- CHECK DATA ---- // + Assert.assertNotNull(user); + Assert.assertEquals(CustomerImpl.class, user.getClass()); + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/BaseDAOImplTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImplTest.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImplTest.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImplTest.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,65 @@ +package org.nuiton.sandbox.jsr317.jpa2.persistence; + +import javax.persistence.PersistenceException; +import org.junit.Assert; +import org.junit.Test; +import org.nuiton.sandbox.jsr317.jpa2.entity.Address; +import org.nuiton.sandbox.jsr317.jpa2.entity.Customer; +import org.nuiton.sandbox.jsr317.jpa2.test.AddressFake; +import org.nuiton.sandbox.jsr317.jpa2.test.BaseTest; +import org.springframework.transaction.annotation.Transactional; + +/** + * Created on 22 oct. 2010 + * + * @author fdesbois <florian.desbois@codelutin.com> + * @version $Id$ + */ +public class CustomerDAOImplTest extends BaseTest { + + @Override + protected boolean autoDataEnabled() { + return true; + } + + @Test + @Transactional + public void testCreateCustomerWithAddress() { + + Customer user = userDAO.newInstance(); + user.setLastName("createCustomerWithAddressLastName"); + user.setFirstName("createCustomerWithAddressFirstName"); + + Address address = userDAO.newInstanceAddress(); + address.setStreet("createStreet"); + address.setZipCode("40000"); + + user.setAddress(address); + + Assert.assertNotNull(user.getAddress()); + Assert.assertEquals("createStreet", user.getAddress().getStreet()); + } + + /** + * Test to check that an other address that AddressImpl can't be save into Customer entity.. + * This test is for {@link JpaHelper#safeEmbeddableCast(Object, Class)} method in real context. Note that @Transactional will break + * this test because flushing the session reproduce the Exception a second time after saving the entity. + */ + @Test(expected = PersistenceException.class) + public void testCreateCustomerWithFakeAddressImplementation() { + + Customer user = userDAO.newInstance(); + user.setLastName("createCustomerWithFakeAddressLastName"); + user.setFirstName("createCustomerWithFakeAddressFirstName"); + + Address address = new AddressFake(); + + address.setStreet("fakeStreet"); + address.setZipCode("40000"); + + user.setAddress(address); + + userDAO.save(user); + } + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/persistence/CustomerDAOImplTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/AddressFake.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/AddressFake.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/AddressFake.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,61 @@ +package org.nuiton.sandbox.jsr317.jpa2.test; + +import org.nuiton.sandbox.jsr317.jpa2.entity.Address; +import org.nuiton.sandbox.jsr317.jpa2.persistence.JpaHelper; + +/** + * Fake implementation of address to test Embeddable target management (need explicit cast provided by {@link + * JpaHelper#safeEmbeddableCast(Object, Class)} + * + * Created on 22 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +public class AddressFake implements Address { + + @Override + public String getStreet() { + return null; + } + + @Override + public void setStreet(String street) { + } + + @Override + public String getStreet2() { + return null; + } + + @Override + public void setStreet2(String street2) { + } + + @Override + public String getZipCode() { + return null; + } + + @Override + public void setZipCode(String zipCode) { + } + + @Override + public String getTown() { + return null; + } + + @Override + public void setTown(String town) { + } + + @Override + public String getCountry() { + return null; + } + + @Override + public void setCountry(String country) { + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/AddressFake.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/BaseTest.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/BaseTest.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/BaseTest.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,76 @@ +package org.nuiton.sandbox.jsr317.jpa2.test; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Rule; +import org.junit.rules.TestName; +import org.junit.runner.RunWith; +import org.junit.runners.model.FrameworkMethod; +import org.nuiton.sandbox.jsr317.jpa2.persistence.CustomerDAO; +import org.nuiton.sandbox.jsr317.jpa2.sample.DataSampleProvider; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Created on 18 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(locations = {"/test-context.xml"}) +public abstract class BaseTest { + + private static final Log logger = LogFactory.getLog(BaseTest.class); + + @PersistenceContext + protected EntityManager em; + + @Autowired + protected DataSampleProvider dataProvider; + + @Autowired + protected CustomerDAO userDAO; + + @Rule + public TestName rule = new TestName() { + + @Override + public void starting(FrameworkMethod method) { + super.starting(method); + if (autoDataEnabled()) { + try { + dataProvider.createAllData(); + } catch (Exception eee) { + logger.error(eee.getClass().getSimpleName(), eee); + } + } + } + + @Override + public void finished(FrameworkMethod method) { + if (autoDataEnabled()) { + + Rollback rollback = method.getAnnotation(Rollback.class); + + if (rollback == null || rollback.value()) { + dataProvider.deleteAllData(); + } + } + super.finished(method); + } + + public BaseTest getTest() { + return BaseTest.this; + } + }; + + protected boolean autoDataEnabled() { + return false; + } + +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/BaseTest.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/JpaConfigTestSource.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/JpaConfigTestSource.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/JpaConfigTestSource.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,67 @@ +package org.nuiton.sandbox.jsr317.jpa2.test; + +import javax.sql.DataSource; +import java.util.Properties; +import org.hibernate.dialect.H2Dialect; +import org.nuiton.sandbox.jsr317.jpa2.persistence.JpaConfigSource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; + +/** + * Jpa configuration for tests. + * <p /> + * Created on 21 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + */ +@Configuration +public class JpaConfigTestSource implements JpaConfigSource { + + @Value("${jdbc.url}") + private String jdbcUrl; + + @Value("${jdbc.username}") + private String jdbcUsername; + + @Value("${jdbc.password}") + private String jdbcPassword; + + @Bean + @Override + public JpaVendorAdapter jpaVendorAdapter() { + HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); + jpaVendorAdapter.setShowSql(true); + jpaVendorAdapter.setGenerateDdl(true); + jpaVendorAdapter.setDatabasePlatform(H2Dialect.class.getName()); + return jpaVendorAdapter; + } + + @Bean + @Override + public Properties jpaProperties() { + Properties properties = new Properties(); + properties.put("hibernate.hbm2ddl.auto", "create"); + // WARNING : when using this property, flushing is needed after first persist and merge to execute INSERT as default strategy does, + // otherwise detaching the entity will not insert it + properties.put("hibernate.id.new_generator_mappings", "true"); + + return properties; + } + + @Bean + @Override + public DataSource dataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + + dataSource.setUrl(jdbcUrl); + dataSource.setUsername(jdbcUsername); + dataSource.setPassword(jdbcPassword); + + return dataSource; + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/JpaConfigTestSource.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/SpringTestConfig.java =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/SpringTestConfig.java (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/SpringTestConfig.java 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,36 @@ +package org.nuiton.sandbox.jsr317.jpa2.test; + +import org.nuiton.sandbox.jsr317.jpa2.persistence.JpaConfig; +import org.nuiton.sandbox.jsr317.jpa2.persistence.JpaConfigSource; +import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.core.io.ClassPathResource; + +/** + * Configuration used for tests. This will import default {@link JpaConfig} and use {@link JpaConfigTestSource} as {@link JpaConfigSource} + * implementation needed by the JpaConfig. + * <p /> + * Created on 21 oct. 2010 + * + * @author fdesbois <fdesbois@codelutin.com> + * @version $Id$ + * @see JpaConfigTestSource + */ +@Configuration +@Import({JpaConfig.class, JpaConfigTestSource.class}) +public class SpringTestConfig { + + /** + * Used to retrieve properties from jdbc-test.properties file. @Value annotation can be used to inject those properties + * + * @return PropertyPlaceholderConfigurer defined + */ + @Bean + public PropertyPlaceholderConfigurer propertyConfigurer() { + PropertyPlaceholderConfigurer propertyConfigurer = new PropertyPlaceholderConfigurer(); + propertyConfigurer.setLocation(new ClassPathResource("/jdbc-test.properties")); + return propertyConfigurer; + } +} Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/java/org/nuiton/sandbox/jsr317/jpa2/test/SpringTestConfig.java ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/META-INF/persistence.xml =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/resources/META-INF/persistence.xml (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/resources/META-INF/persistence.xml 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,10 @@ +<persistence xmlns="http://java.sun.com/xml/ns/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"> + + <persistence-unit name="jsr317-test" transaction-type="RESOURCE_LOCAL"> + <class>org.nuiton.sandbox.jsr317.jpa2.entity.CustomerImpl</class> + </persistence-unit> + +</persistence> \ No newline at end of file Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/META-INF/persistence.xml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/jdbc-test.properties =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/resources/jdbc-test.properties (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/resources/jdbc-test.properties 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,3 @@ +jdbc.url=jdbc:h2:file:./target/surefire-data/jsr317 +jdbc.username=sa +jdbc.password= \ No newline at end of file Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/jdbc-test.properties ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/log4j.properties =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/resources/log4j.properties (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/resources/log4j.properties 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,11 @@ +# Default to info level output; this is very handy if you eventually use Hibernate as well. +log4j.rootCategory=warn, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d [%p] (%c:%L) %m%n + +log4j.logger.org.nuiton.sandbox.jsr317.jpa2=info Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/log4j.properties ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Added: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/test-context.xml =================================================================== --- jpa2-validation/trunk/jsr317-jpa2/src/test/resources/test-context.xml (rev 0) +++ jpa2-validation/trunk/jsr317-jpa2/src/test/resources/test-context.xml 2010-11-12 17:53:20 UTC (rev 433) @@ -0,0 +1,16 @@ +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + + <!--<import resource="classpath:META-INF/jsr317-spring-context.xml"/>--> + + <!-- Load Spring Configuration from Java file --> + <bean class="org.nuiton.sandbox.jsr317.jpa2.test.SpringTestConfig" /> + + <!-- Scan sample --> + <context:component-scan base-package="org.nuiton.sandbox.jsr317.jpa2.sample" /> + +</beans> \ No newline at end of file Property changes on: jpa2-validation/trunk/jsr317-jpa2/src/test/resources/test-context.xml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL Modified: jpa2-validation/trunk/pom.xml =================================================================== --- jpa2-validation/trunk/pom.xml 2010-11-05 12:45:44 UTC (rev 432) +++ jpa2-validation/trunk/pom.xml 2010-11-12 17:53:20 UTC (rev 433) @@ -27,12 +27,121 @@ <dependencies> <dependency> + <groupId>org.nuiton</groupId> + <artifactId>nuiton-utils</artifactId> + <version>1.4.2</version> + </dependency> + + <!-- SPRING --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-orm</artifactId> + <version>${springVersion}</version> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + <version>${springVersion}</version> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-jdbc</artifactId> + <version>${springVersion}</version> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + <version>${springVersion}</version> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + <version>${springVersion}</version> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-tx</artifactId> + <version>${springVersion}</version> + </dependency> + + <!-- JPA : JSR-317- --> + <dependency> + <groupId>org.hibernate.javax.persistence</groupId> + <artifactId>hibernate-jpa-2.0-api</artifactId> + <version>${jpa2ApiVersion}</version> + </dependency> + + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-jpamodelgen</artifactId> + <version>${jpa2ApiVersion}</version> + </dependency> + + <!-- Bean Validation : JSR-303 --> + <dependency> + <groupId>javax.validation</groupId> + <artifactId>validation-api</artifactId> + <version>${validationApiVersion}</version> + </dependency> + + <!-- LOGGING --> + <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4jVersion}</version> <scope>runtime</scope> </dependency> + <!-- TESTS --> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>1.2.143</version> + <scope>test</scope> + </dependency> + + <!-- Hibernate implementation used for tests --> + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-entitymanager</artifactId> + <version>${hibernateVersion}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-validator</artifactId> + <version>${hibernateValidatorVersion}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4jVersion}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>${slf4jVersion}</version> + <scope>test</scope> + </dependency> + + <!-- Testing --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <version>${springVersion}</version> + <scope>test</scope> + </dependency> + </dependencies> </dependencyManagement> @@ -52,6 +161,17 @@ <packaging>pom</packaging> <properties> + + <!-- Dependencies versions --> + <springVersion>3.0.4.RELEASE</springVersion> + <jpa2ApiVersion>1.0.0.Final</jpa2ApiVersion> + <validationApiVersion>1.0.0.GA</validationApiVersion> + + <!-- For test only : Hibernate implementation for JSR used --> + <hibernateVersion>3.5.6-Final</hibernateVersion> + <hibernateValidatorVersion>4.0.2.GA</hibernateValidatorVersion> + <slf4jVersion>1.6.1</slf4jVersion> + </properties> <!-- Source control management. --> Property changes on: jpa2-validation/trunk/pom.xml ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision HeadURL
participants (1)
-
fdesbois@users.nuiton.org