Tagged: eclipselink
Overriding JTA into RESOUCE-LOCAL while Unit Testing
references
JTA
Let’s say you have a very simple persistence.xml looks like this.
<persistence-unit name="somePU" transaction-type="JTA"> <jta-data-source>jdbc/someDS</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.validation.mode" value="CALLBACK" /> </properties> </persistence-unit>
RESOUCE-LOCAL
You can, maybe you should, override it for unit testing. Following codes uses EclipseLink dependent API.
final Map<String, String> properties = new HashMap<>(); properties.put(PersistenceUnitProperties.TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name()); properties.put(PersistenceUnitProperties.JDBC_DRIVER, "org.apache.derby.jdbc.EmbeddedDriver"); properties.put(PersistenceUnitProperties.JDBC_URL, "jdbc:derby:memory:testDB;create=true"); properties.put(PersistenceUnitProperties.DDL_GENERATION, PersistenceUnitProperties.CREATE_ONLY); properties.put(PersistenceUnitProperties.LOGGING_LEVEL, Level.FINE.getName()); properties.put(PersistenceUnitProperties.TARGET_SERVER, TargetServer.None); ENTITY_MANAGER_FACTORY = createEntityManagerFactory("somePU", properties);
A bug of EclipseLink with Lambda expressions
references
error
GlassFish which ships EclipseLink suddenly started refusing my war file.
...Message] uses a non-entity [class ...Attachment] as target entity in the relationship attribute [field attachments].
new hotness
The problem is that Attachment
class contains a lambda expression.
@XmlAttribute public Long getMessageId() { return ofNullable(message).map(Message::getId()).orElse(null); }
old and busted
@XmlAttribute public Long getMessageId() { return message != null ? message.getId() : null; }
jpa-metamodels-with-maven
Sourcecode
$ git clone git@github.com:jinahya/jpa-metamodels-with-maven-example.git $ cd jpa-metamodels-with-maven $ git checkout develop $ mvn help:all-profiles
Hibernate
With direct dependencies
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <scope>compile</scope> <optional>true</optional> </dependency> </dependencies>
Using maven-processor-plugin
<build> <plugins> <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> <processors> <processor>org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor</processor> </processors> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>${hibernate.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
Apache OpenJPA
With direct dependencies
It seems that Apache OpenJPA must be triggered with a specific compiler argument.
<dependencies> <dependency> <groupId>org.apache.openjpa</groupId> <artifactId>openjpa</artifactId> <scope>compile</scope> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgs> <arg>-Aopenjpa.metamodel=true</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
Using maven-processor-plugin
Again, Apache OpenJPA requires some additional configuration.
<build> <plugins> <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> <processors> <processor>org.apache.openjpa.persistence.meta.AnnotationProcessor6</processor> </processors> <optionMap> <openjpa.metamodel>true</openjpa.metamodel> </optionMap> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.apache.openjpa</groupId> <artifactId>openjpa</artifactId> <version>${openjpa.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
EclipseLink
For EclipseLink, the location of persistence.xml must be specified.
Using direct dependencies
<dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId> <scope>compile</scope> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <compilerArgs> <arg>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
Using maven-processor-plugin
<build> <plugins> <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> <processors> <processor>org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor</processor> </processors> <compilerArguments>-Aeclipselink.persistencexml=src/main/resources/META-INF/persistence.xml</compilerArguments> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>org.eclipse.persistence.jpa.modelgen.processor</artifactId> <version>${eclipselink.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>
DataNucleus
Using direct dependencies
When working with DataNucleus, an additional dependency needs to be specified.
<dependencies> <dependency> <groupId>org.datanucleus</groupId> <artifactId>datanucleus-jpa-query</artifactId> <scope>compile</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.datanucleus</groupId> <artifactId>datanucleus-core</artifactId> <version>${datanucleus.version}</version> <scope>compile</scope> <optional>true</optional> </dependency> </dependencies>
Using maven-processor-plugin
<build> <plugins> <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> <processors> <processor>org.datanucleus.jpa.query.JPACriteriaProcessor</processor> </processors> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>org.datanucleus</groupId> <artifactId>datanucleus-jpa-query</artifactId> <version>${datanucleus.version}</version> </dependency> <dependency> <groupId>org.datanucleus</groupId> <artifactId>datanucleus-core</artifactId> <version>${datanucleus.version}</version> </dependency> </dependencies> </plugin> </plugins> </build>