Hi Mike, <response-to-disclosure>The sample (https://issues.apache.org/jira/secure/attachment/12423038/case-sandbox.zip) can be unzipped and run immediately via maven (as well as imported into eclipse). Try it--it'll be fun! :) </response-to-disclosure>
I tried your suggestion of going to property access (for both Concrete & Pebble), which is very much **not** desirable IMHO, and moving the @OneToMany annotation to BuildingMaterial's getPebbles() method. I got an interesting result. The schema came out correctly with only two tables, but I got a runtime error attempting to persist a new Concrete: <openjpa-1.2.1-r752877:753278 nonfatal store error> org.apache.openjpa.persistence.EntityExistsException: Attempt to persist detached object "example.model.concr...@81fb". If this is a new instance, make sure any version and/or auto-generated primary key fields are null/default when persisting. FailedObject: example.model.concr...@81fb I've uploaded the property example to OPENJPA-1361 (https://issues.apache.org/jira/secure/attachment/12423454/case-sandbox-property-access.zip), but property access is not something I want to move to. Short of defining two methods for each property (one to be called by OpenJPA, one to be called by clients of the entity), I can't execute any business logic in the setter methods. That's the traditional argument against property access, one to which I subscribe. Thanks for thinking about the problem, though! -matthew On Tue, Oct 27, 2009 at 7:04 PM, Michael Dick <[email protected]> wrote: > Hi Matthew, > > <disclosure>I haven't tried the example you submitted. </disclosure> > > 1. If I had to guess I'd say that it's because the interface > (BuildingMaterial) doesn't have the @OneToMany annotation, and as a result > it's not a valid target for the relationship. Adding the annotatation (and > switching to property access instead of field access) might help here. > > If you can't move to property access and add the annotation then I'm not > sure how you could use an interface.. Using a MappedSuperclass for > BuildingMaterial instead of an interface (could be an abstract > MappedSuperclass though). > > 2. I'd have to look into @JoinColumn, I suspect it would result in similar > behavior though (I'm prepared to be wrong here - haven't used JoinColumn > much). > > Hope this helps > -mike > > On Fri, Oct 23, 2009 at 12:54 PM, Matthew Adams > <[email protected]>wrote: > >> Hi all, >> >> NB: All source for this example is attached and is pasted at the end >> of this email, in case the attachment doesn't survive the mailing >> list. I've also entered the following JIRA to track this issue: >> https://issues.apache.org/jira/browse/OPENJPA-1361 >> >> Synopsis: bidirectional one-to-many relationship where the one side >> references the objects on the many side using a concrete class >> reference and the many side references the object on the one side >> using an interface reference. When specifying the mappedBy property >> of the @OneToMany annotation, OpenJPA throws the error: >> >> Collection field "example.model.Concrete.pebbles" declares that it is >> mapped by "example.model.Pebble.buildingMaterial", but this is not a >> valid inverse relation. >> >> When I remove the mappedBy property, everything works fine, except >> that OpenJPA creates an extra join table (Concrete_Pebble) where it >> shouldn't, IMHO. I have two questions, an answer to either one of >> which will suffice: >> >> 1. Why can't I use mappedBy in this scenario? >> 2. How do I annotate things with @JoinColumn or similar that will >> allow me to not have a join table and only the reference from Pebble >> back to its BuildingMaterial? >> >> Thanks, >> Matthew >> ==================== >> package example.model; >> >> import java.util.HashSet; >> import java.util.Set; >> >> import javax.persistence.CascadeType; >> import javax.persistence.Column; >> import javax.persistence.Entity; >> import javax.persistence.FetchType; >> import javax.persistence.GeneratedValue; >> import javax.persistence.GenerationType; >> import javax.persistence.Id; >> import javax.persistence.OneToMany; >> import javax.persistence.Version; >> >> @Entity >> public class Concrete implements BuildingMaterial { >> >> �...@id >> �...@generatedvalue(strategy = GenerationType.AUTO) >> �...@column(name = "id") >> private Long assignedId; >> >> �...@version >> �...@column(name = "version") >> private long assignedVersion; >> >> �...@onetomany(cascade = { CascadeType.MERGE, CascadeType.REFRESH, >> CascadeType.PERSIST }, fetch = FetchType.LAZY) >> public Set<Pebble> pebbles = new HashSet<Pebble>(); >> >> public Long getId() { >> return assignedId; >> } >> >> public long getVersion() { >> return assignedVersion; >> } >> >> public Discriminator getDiscriminator() { >> return Discriminator.CONCRETE; >> } >> >> public void add(Pebble pebble) { >> this.pebbles.add(pebble); >> pebble.buildingMaterial = this; >> } >> >> public Set<Pebble> getPebbles() { >> return new HashSet<Pebble>(pebbles); >> } >> } >> =========================== >> package example.model; >> >> import javax.persistence.CascadeType; >> import javax.persistence.Column; >> import javax.persistence.Entity; >> import javax.persistence.FetchType; >> import javax.persistence.GeneratedValue; >> import javax.persistence.GenerationType; >> import javax.persistence.Id; >> import javax.persistence.ManyToOne; >> import javax.persistence.Version; >> >> import org.apache.openjpa.persistence.jdbc.Strategy; >> >> @Entity >> public class Pebble implements PersistentlyIdentifiable { >> >> �...@id >> �...@generatedvalue(strategy = GenerationType.AUTO) >> �...@column(name = "id") >> private Long assignedId; >> >> �...@version >> �...@column(name = "version") >> private long assignedVersion; >> >> �...@manytoone(cascade = { CascadeType.MERGE, CascadeType.REFRESH, >> CascadeType.PERSIST }, fetch = FetchType.LAZY) >> �...@strategy("example.openjpa.PersistentInterfaceValueHandler") >> protected BuildingMaterial buildingMaterial; >> >> public Long getId() { >> return assignedId; >> } >> >> public long getVersion() { >> return assignedVersion; >> } >> >> public void setBuildingMaterial(BuildingMaterial buildingMaterial) { >> buildingMaterial.add(this); >> } >> >> public Discriminator getDiscriminator() { >> return Discriminator.PEBBLE; >> } >> >> public BuildingMaterial getBuildingMaterial() { >> return buildingMaterial; >> } >> } >> ============================ >> package example.model; >> >> public interface PersistentlyIdentifiable { >> Comparable<?> getId(); >> >> long getVersion(); >> >> Discriminator getDiscriminator(); >> } >> ============================ >> package example.model; >> >> import java.util.Set; >> >> public interface BuildingMaterial extends PersistentlyIdentifiable { >> >> void add(Pebble pebble); >> >> Set<Pebble> getPebbles(); >> } >> ============================ >> package example.model; >> >> import java.util.HashMap; >> import java.util.Map; >> >> /** >> * Enum used to store discriminators in the database for polymorphic >> references. >> */ >> public enum Discriminator { >> >> CONCRETE(Concrete.class), PEBBLE(Pebble.class); >> >> private static class X { >> public static final Map<String, Discriminator> >> discriminatorsByClassName = new HashMap<String, Discriminator>(); >> >> public static void storeByClassName(Discriminator >> discriminator) { >> synchronized (discriminatorsByClassName) { >> >> discriminatorsByClassName.put(discriminator.getClassName(), >> discriminator); >> } >> } >> } >> >> private Discriminator(Class<?> clazz) { >> this.className = clazz.getName(); >> X.storeByClassName(this); >> } >> >> private String className; >> >> public String getClassName() { >> return className; >> } >> >> public static Discriminator getDiscriminatorEnum(String className) { >> return X.discriminatorsByClassName.get(className); >> } >> >> public static String getDiscriminatorName(Class<?> clazz) { >> Discriminator d = getDiscriminatorEnum(clazz.getName()); >> if (d == null) { >> throw new IllegalArgumentException("Class " + >> clazz.getName() >> + " does not have a corresponding >> Discriminator"); >> } >> return d.name(); >> } >> >> public static Class<?> getDiscriminatorClassFor(String name) >> throws ClassNotFoundException { >> >> return getDiscriminatorClassFor(name, Discriminator.class >> .getClassLoader()); >> } >> >> public static Class<?> getDiscriminatorClassFor(String name, >> ClassLoader loader) throws ClassNotFoundException { >> >> return >> Class.forName(Discriminator.valueOf(name).getClassName(), true, >> loader); >> } >> } >> =========================== >> package example.openjpa; >> >> import java.sql.SQLException; >> >> import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration; >> import org.apache.openjpa.jdbc.kernel.JDBCStore; >> import org.apache.openjpa.jdbc.meta.ValueMapping; >> import org.apache.openjpa.jdbc.meta.strats.AbstractValueHandler; >> import org.apache.openjpa.jdbc.schema.Column; >> import org.apache.openjpa.jdbc.schema.ColumnIO; >> import org.apache.openjpa.kernel.OpenJPAStateManager; >> import org.apache.openjpa.kernel.StoreContext; >> import org.apache.openjpa.meta.JavaTypes; >> import org.apache.openjpa.util.StoreException; >> import org.slf4j.Logger; >> import org.slf4j.LoggerFactory; >> >> import example.model.Discriminator; >> import example.model.PersistentlyIdentifiable; >> >> @SuppressWarnings("serial") >> public class PersistentInterfaceValueHandler extends AbstractValueHandler { >> >> Logger log = >> LoggerFactory.getLogger(PersistentInterfaceValueHandler.class); >> >> �...@override >> public Column[] map(ValueMapping valueMapping, String fieldName, >> ColumnIO columnIo, boolean adapt) { >> Column discriminatorColumn = new Column(); >> discriminatorColumn.setName(fieldName.toUpperCase() + >> "_DISCRIMINATOR"); >> discriminatorColumn.setJavaType(JavaTypes.STRING); >> >> Column idColumn = new Column(); >> idColumn.setName(fieldName.toUpperCase() + "_ID"); >> idColumn.setJavaType(JavaTypes.LONG); >> >> return new Column[] { discriminatorColumn, idColumn }; >> } >> >> public boolean isVersionable(ValueMapping vm) { >> return true; >> } >> >> public boolean objectValueRequiresLoad(ValueMapping vm) { >> return true; >> } >> >> public Object toDataStoreValue(ValueMapping vm, Object val, >> JDBCStore store) { >> if (val == null) { >> return new Object[] { null, null }; >> } >> return new Object[] { deriveDiscriminator(val.getClass()), >> ((PersistentlyIdentifiable) val).getId() }; >> } >> >> public String deriveDiscriminator(Class<?> clazz) { >> if (log.isDebugEnabled()) { >> log.debug("Getting discriminator for class: [" + >> clazz.getName() >> + "]"); >> } >> String discriminator = >> Discriminator.getDiscriminatorName(clazz); >> if (log.isDebugEnabled()) { >> log.debug("Discriminator for class: [" + >> clazz.getName() + "]: [" >> + discriminator + "]"); >> } >> return discriminator; >> } >> >> public Class<?> deriveClass(String name, ClassLoader loader) >> throws ClassNotFoundException { >> if (log.isDebugEnabled()) { >> log.debug("Getting class for discriminator: [" + >> name + "]"); >> } >> Class<?> clazz = >> Discriminator.getDiscriminatorClassFor(name, loader); >> if (log.isDebugEnabled()) { >> log.debug("Class for discriminator: [" + name + "]: >> [" >> + clazz.getName() + "]"); >> } >> return clazz; >> } >> >> public Object toObjectValue(ValueMapping vm, Object val, >> OpenJPAStateManager sm, JDBCStore store, >> JDBCFetchConfiguration fetch) throws SQLException { >> >> if (val == null) { >> return null; >> } >> Object[] values = (Object[]) val; >> StoreContext ctx = store.getContext(); >> ClassLoader loader = store.getConfiguration() >> >> .getClassResolverInstance().getClassLoader(vm.getType(), >> ctx.getClassLoader()); >> Class<?> cls = null; >> String clsName = (String) values[0]; >> Long oidStr = (Long) values[1]; >> if (clsName == null) { >> return null; >> } >> try { >> cls = deriveClass(clsName, loader); >> } catch (ClassNotFoundException cnfe) { >> throw new StoreException(cnfe); >> } >> Object oid = ctx.newObjectId(cls, oidStr); >> return store.find(oid, vm, fetch); >> } >> } >> ======================== >> package example.test.integration; >> >> import static org.junit.Assert.assertEquals; >> import static org.junit.Assert.assertNotNull; >> >> import java.util.Set; >> >> import org.junit.Test; >> import org.springframework.transaction.annotation.Transactional; >> >> import example.model.BuildingMaterial; >> import example.model.Concrete; >> import example.model.Pebble; >> >> public class ConcretePebbleTest extends AbstractJpaTest { >> >> �...@test >> �...@transactional >> public void testConcrete() { >> >> BuildingMaterial bm = new Concrete(); >> em.persist(bm); >> >> Pebble p = new Pebble(); >> bm.add(p); >> >> em.flush(); >> >> Object bmid = bm.getId(); >> Object pid = p.getId(); >> >> em.clear(); >> >> // navigate from BuildingMaterials side >> bm = em.find(bm.getClass(), bmid); >> Set<Pebble> pebbles = null; >> assertNotNull(pebbles = bm.getPebbles()); >> assertEquals(1, pebbles.size()); >> >> em.clear(); >> >> // navigate from Pebble side >> p = em.find(Pebble.class, pid); >> assertNotNull(bm = p.getBuildingMaterial()); >> } >> } >> ======================= >> package example.test.integration; >> >> import javax.annotation.PostConstruct; >> import javax.persistence.EntityManager; >> import javax.persistence.EntityManagerFactory; >> import javax.persistence.PersistenceContext; >> >> import org.junit.runner.RunWith; >> import org.springframework.beans.factory.annotation.Autowired; >> import org.springframework.test.context.ContextConfiguration; >> import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; >> >> @ContextConfiguration(locations={"classpath:applicationContext.xml"}) >> @RunWith(SpringJUnit4ClassRunner.class) >> abstract public class AbstractJpaTest { >> >> �...@autowired >> protected EntityManagerFactory emf; >> >> �...@persistencecontext >> protected EntityManager em; >> >> �...@postconstruct >> public void afterPropertiesSet() throws Exception { >> emf.createEntityManager(); >> } >> } >> ======================== >> package example.test.unit; >> >> import static org.junit.Assert.assertEquals; >> >> import org.junit.Test; >> >> import example.model.Concrete; >> import example.model.Discriminator; >> >> public class DiscriminatorTest { >> >> �...@test >> public void testDiscriminator() throws ClassNotFoundException { >> Discriminator d = Discriminator.CONCRETE; >> >> assertEquals(Discriminator.getDiscriminatorName(Concrete.class), d >> .name()); >> >> assertEquals(Discriminator.getDiscriminatorClassFor(d.name >> ()), >> Concrete.class); >> } >> } >> =========================== >> # log4j.properties >> log4j.rootLogger=ERROR, A1 >> log4j.appender.A1=org.apache.log4j.ConsoleAppender >> log4j.appender.A1.layout=org.apache.log4j.PatternLayout >> log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss.SSS} [%t] %-5p >> %c %x - %m%n >> >> log4j.logger.example=debug >> =========================== >> # test.properties >> test.database=my-integration-test >> =========================== >> <!-- applicationContext.xml --> >> <?xml version="1.0" >> encoding="UTF-8"?> >> >> <beans xmlns="http://www.springframework.org/schema/beans" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> xmlns:aop="http://www.springframework.org/schema/aop" >> 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-2.5.xsd >> http://www.springframework.org/schema/aop >> http://www.springframework.org/schema/aop/spring-aop-2.5.xsd >> http://www.springframework.org/schema/tx >> http://www.springframework.org/schema/tx/spring-tx-2.5.xsd >> >> http://www.springframework.org/schema/context >> http://www.springframework.org/schema/context/spring-context-2.5.xsd"> >> >> <bean >> >> class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> >> <property name="location" value="classpath:test.properties" >> /> >> </bean> >> >> <bean id="HsqldbDataSource" class="org.hsqldb.jdbc.jdbcDataSource"> >> <property name="user" value="sa" /> >> <property name="database" >> value="jdbc:hsqldb:mem:${test.database}" /> >> </bean> >> >> <bean id="entityManagerFactory" >> >> class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> >> <property name="persistenceUnitName" value="case-sandbox" /> >> <property name="jpaProperties"> >> <value> >> openjpa.AutoDetach=commit >> openjpa.DetachState=fgs >> openjpa.QueryCache=false >> openjpa.jdbc.SubclassFetchMode=none >> openjpa.jdbc.EagerFetchMode=none >> >> openjpa.jdbc.SynchronizeMappings=buildSchema(ForeignKeys=true) >> </value> >> </property> >> <property name="jpaVendorAdapter"> >> <bean >> class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter"> >> <property name="showSql" >> value="${test.showSql}" /> >> <property name="generateDdl" value="false" >> /> >> </bean> >> </property> >> <property name="dataSource" ref="HsqldbDataSource" /> >> </bean> >> <bean >> >> class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" >> /> >> >> <bean id="transactionManager" >> class="org.springframework.orm.jpa.JpaTransactionManager"> >> <property name="entityManagerFactory" >> ref="entityManagerFactory" /> >> <property name="jpaDialect"> >> <bean >> class="org.springframework.orm.jpa.vendor.OpenJpaDialect" /> >> </property> >> <property name="dataSource" ref="HsqldbDataSource" /> >> </bean> >> <tx:annotation-driven transaction-manager="transactionManager" >> proxy-target-class="true" /> >> >> </beans> >> ============================= >> <!-- orm.xml --> >> <?xml version="1.0" encoding="UTF-8" ?> >> <entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm >> http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" >> version="1.0"> >> >> <persistence-unit-metadata> >> <persistence-unit-defaults> >> <access>FIELD</access> >> <cascade-persist/> >> </persistence-unit-defaults> >> </persistence-unit-metadata> >> >> </entity-mappings> >> ================================ >> <!-- persistence.xml --> >> <?xml version="1.0" >> encoding="UTF-8"?> >> >> <persistence xmlns="http://java.sun.com/xml/ns/persistence" >> version="1.0"> >> <persistence-unit name="case-sandbox"> >> <provider> >> org.apache.openjpa.persistence.PersistenceProviderImpl >> </provider> >> </persistence-unit> >> </persistence> >> =============================== >> <!-- pom.xml --> >> <?xml version="1.0" >> encoding="UTF-8"?> >> >> <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> >> <groupId>org.mytest</groupId> >> <artifactId>case-sandbox</artifactId> >> <packaging>jar</packaging> >> <version>1.0.0-SNAPSHOT</version> >> <name>Sandbox</name> >> <properties> >> <surefire.debug.suspend>n</surefire.debug.suspend> >> <test.showSql>true</test.showSql> >> <spring.version>2.5.6</spring.version> >> <slf4j.version>1.5.6</slf4j.version> >> <jpa.spec.version>1.0</jpa.spec.version> >> <openjpa.version>1.2.1</openjpa.version> >> <hsql.version>1.8.0.1</hsql.version> >> </properties> >> <dependencies> >> <dependency> >> <groupId>org.slf4j</groupId> >> <artifactId>slf4j-log4j12</artifactId> >> <version>${slf4j.version}</version> >> </dependency> >> <dependency> >> <groupId>org.slf4j</groupId> >> <artifactId>slf4j-api</artifactId> >> <version>${slf4j.version}</version> >> </dependency> >> <dependency> >> <groupId>javax.persistence</groupId> >> <artifactId>persistence-api</artifactId> >> <version>${jpa.spec.version}</version> >> </dependency> >> <dependency> >> <groupId>org.apache.openjpa</groupId> >> <artifactId>openjpa</artifactId> >> <version>${openjpa.version}</version> >> </dependency> >> <dependency> >> <groupId>hsqldb</groupId> >> <artifactId>hsqldb</artifactId> >> <version>${hsql.version}</version> >> </dependency> >> <dependency> >> <groupId>org.springframework</groupId> >> <artifactId>spring</artifactId> >> <version>${spring.version}</version> >> </dependency> >> <dependency> >> <groupId>junit</groupId> >> <artifactId>junit</artifactId> >> <version>4.6</version> >> </dependency> >> <dependency> >> <groupId>org.springframework</groupId> >> <artifactId>spring-test</artifactId> >> <version>${spring.version}</version> >> <exclusions> >> <exclusion> >> <groupId>junit</groupId> >> <artifactId>junit</artifactId> >> </exclusion> >> </exclusions> >> </dependency> >> <dependency> >> <groupId>cglib</groupId> >> <artifactId>cglib-nodep</artifactId> >> <version>2.1_3</version> >> </dependency> >> <!-- >> <dependency> >> <groupId>org.jmock</groupId> >> <artifactId>jmock-junit4</artifactId> >> <scope>test</scope> >> </dependency> >> --> >> </dependencies> >> <build> >> <testResources> >> <testResource> >> <filtering>true</filtering> >> <directory>src/test/resources</directory> >> <includes> >> <include>**/*</include> >> </includes> >> </testResource> >> </testResources> >> <plugins> >> <plugin> >> <groupId>org.apache.maven.plugins</groupId> >> <artifactId>maven-jar-plugin</artifactId> >> <version>2.2</version> >> <executions> >> <execution> >> <goals> >> <goal>test-jar</goal> >> </goals> >> </execution> >> </executions> >> </plugin> >> <plugin> >> <groupId>org.apache.maven.plugins</groupId> >> >> <artifactId>maven-compiler-plugin</artifactId> >> <configuration> >> <source>1.6</source> >> <target>1.6</target> >> </configuration> >> </plugin> >> <plugin> >> <groupId>org.apache.maven.plugins</groupId> >> <artifactId>maven-antrun-plugin</artifactId> >> <version>1.1</version> >> <executions> >> <execution> >> <id>1</id> >> >> <phase>process-classes</phase> >> <configuration> >> <tasks> >> <path >> id="cp"> >> >> <path refid="maven.compile.classpath" /> >> </path> >> >> <pathconvert >> pathsep=" " property="arguments" >> >> dirsep="."> >> <map >> from="${basedir}/target/classes/" to="" /> >> <map >> from="${basedir}\target\classes\" to="" /> >> >> <mapper> >> >> <chainedmapper> >> >> <globmapper from="*.class" to="*" /> >> >> </chainedmapper> >> >> </mapper> >> >> <path id="model.path"> >> >> <fileset dir="${basedir}/target/classes/"> >> >> <include name="**/*.class" /> >> >> <exclude name="**/annotations/**/*.class" /> >> >> </fileset> >> >> </path> >> >> </pathconvert> >> <java >> classname="org.apache.openjpa.enhance.PCEnhancer" >> >> classpathref="cp" dir="target/classes" fork="true"> >> <arg >> line="${arguments} -p persistence.xml#case-sandbox" /> >> </java> >> </tasks> >> </configuration> >> <goals> >> <goal>run</goal> >> </goals> >> </execution> >> <execution> >> <id>2</id> >> <configuration> >> <tasks> >> <path >> id="cp"> >> >> <path refid="maven.compile.classpath" /> >> </path> >> >> <java classname="org.apache.openjpa.jdbc.meta.MappingTool" >> >> classpathref="cp" dir="target/classes" fork="true"> >> >> >> <arg line="-p persistence.xml#case-sandbox" /> >> >> <arg line="-connectionDriverName org.hsqldb.jdbc.jdbcDataSource" /> >> >> <arg line="-connectionURL jdbc:hsqldb:mem:dummy" /> >> >> <arg line="-schemaAction build" /> >> >> <arg line="-sql ../test.sql" /> >> >> </java> >> >> </tasks> >> </configuration> >> <phase>compile</phase> >> <goals> >> <goal>run</goal> >> </goals> >> </execution> >> >> </executions> >> </plugin> >> <plugin> >> <groupId>org.apache.maven.plugins</groupId> >> >> <artifactId>maven-surefire-plugin</artifactId> >> <version>2.3</version> >> <configuration> >> >> <argLine>-Xrunjdwp:transport=dt_socket,address=9998,server=y,suspend=${surefire.debug.suspend} >> -Xmx512m</argLine> >> <includes> >> >> <include>**/*Test.java</include> >> </includes> >> <excludes> >> >> <exclude>**/integration/**</exclude> >> </excludes> >> </configuration> >> <executions> >> <execution> >> <id>integration-tests</id> >> >> <phase>integration-test</phase> >> <goals> >> <goal>test</goal> >> </goals> >> <configuration> >> <skip>false</skip> >> <excludes> >> >> <exclude>**/unit/**</exclude> >> </excludes> >> <includes> >> >> <include>**/integration/**/*Test.java</include> >> </includes> >> </configuration> >> </execution> >> </executions> >> </plugin> >> </plugins> >> </build> >> </project> >> ================================ >> > -- mailto:[email protected] skype:matthewadams12 yahoo:matthewadams aol:matthewadams12 google-talk:[email protected] msn:[email protected] http://matthewadams.me http://www.linkedin.com/in/matthewadams
