Mapping Guide
There are plenty of resources for learning JPA annotations. Take a look at:
-
Although written for Hibernate, the JPA material should work fine.
Custom Value Types
The framework provides a number of custom value types.
Some of these are wrappers around a single value (eg AsciiDoc or Password) while others map onto multiple values (eg Blob).
This section shows how to map each (and can be adapted for your own custom types or @Embedded values).
Mapping AsciiDoc
-
In the domain entity, map
AsciiDoctype using@Lob:MyEntity.javapublic class MyEntity ... { @Column(nullable = false) @Lob @Basic(fetch=FetchType.LAZY) @Property @Getter @Setter private AsciiDoc documentation; } -
in the webapp module, register the JPA specific converter by:
-
adding a dependency to this module:
pom.xml<dependency> <groupId>org.apache.causeway.valuetypes</groupId> <artifactId>causeway-valuetypes-asciidoc-persistence-jpa</artifactId> </dependency> -
and adding reference the corresponding module in the
AppManifest:AppManifest.java@Configuration @Import({ ... CausewayModuleValAsciidocPersistenceJpa.java ... }) public class AppManifest { }
-
Mapping Markdown
The Markdown value type is used for documentation written using markdown:
-
In the domain entity, map
Markdowntype using@Lob:MyEntity.javapublic class MyEntity ... { @Column(nullable = false) @Lob @Basic(fetch=FetchType.LAZY) @Property @Getter @Setter private Markdown documentation; } -
in the webapp module, register the JPA specific converter by:
-
adding a dependency to this module:
pom.xml<dependency> <groupId>org.apache.causeway.valuetypes</groupId> <artifactId>causeway-valuetypes-markdown-persistence-jpa</artifactId> </dependency> -
and adding reference the corresponding module in the
AppManifest:AppManifest.java@Configuration @Import({ ... CausewayModuleValMarkdownPersistenceJpa.java ... }) public class AppManifest { }
-
Mapping Blobs and Clobs
While the JPA standard does provide a standardised mechanism to marshall single valued types, but does not (currently) provide a standardised mechanism to marshall multiple valued types.
There are two alternatives:
-
use EclipseLink-specific extensions, specifically its @Transformation annotation and the related @WriteTransformer and @ReadTransformer.
-
manually map the class to an @Embeddable class.
We think the second approach is less boilerplate overall, and is easier to understand what is going on.
The framework provides an @Embeddable classes for each of Blob and Clob, explained in the sections below.
Blobs
To map a Blob, use the BlobJpaEmbeddable class:
public class MyEntity ... {
@Embedded
private BlobJpaEmbeddable pdf; (1)
@Property()
@PropertyLayout()
public Blob getPdf() { (2)
return BlobJpaEmbeddable.toBlob(pdf);
}
public void setPdf(final Blob pdf) {
this.pdf = BlobJpaEmbeddable.fromBlob(pdf);
}
}
| 1 | the field as it is persisted by the ORM |
| 2 | the property as it is understood by Apache Causeway. |
if you have multiple instancs of an @Embedded type, the @javax.persistence.AttributeOverrides and @javax.persistence.AttributeOverride provide a standardised way of fine-tuning the column definitions.
|
Clobs
To map a Clob, use the ClobJpaEmbeddable class:
public class MyEntity ... {
@Embedded
private ClobJpaEmbeddable xml; (1)
@Property()
@PropertyLayout()
public Clob getXml() { (2)
return ClobJpaEmbeddable.toClob(xml);
}
public void setXml(final Clob xml) {
this.xml = ClobJpaEmbeddable.fromClob(xml);
}
}
| 1 | the field as it is persisted by the ORM |
| 2 | the property as it is understood by Apache Causeway. |
if you have multiple instances of an @Embedded type, the @javax.persistence.AttributeOverrides and @javax.persistence.AttributeOverride provide a standardised way of fine-tuning the column definitions.
|