Extending Domain Model
The Elastic Path Commerce platform is built on a flexible e-commerce domain object model. If your organization has specific needs, you can extend it. Changes to the domain object model affect the platform on many levels, both in terms of functionality and performance. Before making domain changes, you need to carefully consider the impact.
Be aware of how Load tuners and FetchGroups optimize the loading of fields for different types of objects
If you are thinking about extending catalog-related domain objects (
Product
,Catalog
, etc.), consider whether you can use attributes instead
The basic steps for extending the domain object model are:
- Modifying the database schema
- Creating the domain class and interface
- Modifying the ORM configuration
- Add references to the Persistence Unit
- Registering new domain classes with the BeanRegistrar
Optional steps you may need are:
Modifying the database schema
When creating or modifying a domain object, you need to extend the database to store the new data.
If you are creating a completely new domain object, you will need to add a new table.
If you’re extending an existing domain object, we recommended that you use the joined inheritance strategy. With this strategy, the base class’s data is stored in the base table and your extended class’s data is stored in another table. To implement this, you need to:
Add a table to store the extension class’s data.
Add a discriminator column in the base domain object’s table.
This discriminator column is used by the persistence layer to identify, for each row, which table contains the row’s extended class’s data field.
Creating the domain class and interface
Any new or extended domain object has both an interface defining the methods and a class containing the implementation. To ensure the domain object’s data is persisted and loaded correctly, the implementation class need to contain the appropriate JPA annotations.
At the class level, include the following annotations:
@Entity
and@Table
- Identifies the object as an Entity, which is an object that can be persisted in the system.@DiscriminatorValue
- Required for an extended domain object. Identifies a value that will be stored in the base table’s discriminator column. The value differentiates the domain objects and the extension objects in their common database table.@DataCache
- Extended domain objects do not automatically inherit data cache settings. If the parent class specifies data cache settings, the extended class must also include a matching annotation.@ShopperReadOnly
- Identifies if the entity should be protected from modification by shoppers. If specified, any attempt by Cortex to insert, update, or delete a record of this type will cause anEpSystemException
to be thrown.
At the method level, include the following annotations:
@Basic
and@Column
annotations on the getter methods to specify how field data is mapped to table columns.- Annotation required to load data from related tables, such as
@OneToMany
The following code snippet shows the table annotations for an extension of the OrderImpl
class.
@Entity
@Table(name = ExtOrderImpl.TABLE_NAME)
@DiscriminatorValue("extOrder")
@DataCache(enabled = false)
@PrimaryKeyJoinColumn(name="UIDPK", referencedColumnName="UIDPK")
public class ExtOrderImpl extends OrderImpl implements ExtOrder {
...
public static final String TABLE_NAME = "TORDEREXT";
For more information, see the OpenJPA documentation on metadata mapping.
Modifying the ORM (Object Relational Mapping) configuration
If you’re extending an existing domain class, JPA needs to be made aware that the base class accepts extensions. This means overriding the JPA metadata for the base class.
To do this, open the extensions/core/ext-core/src/main/resources/META-INF
folder and add a new metadata ORM file.
For example, to make OrderImpl
extensible, create ext-order-orm.xml
and populate it with the following:
<?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_2_0.xsd" version="2.0">
<entity class="com.elasticpath.domain.order.impl.OrderImpl">
<inheritance strategy="SINGLE_TABLE"/>
<discriminator-value>OrderImpl</discriminator-value>
<discriminator-column name="TYPE" discriminator-type="STRING"/>
</entity>
</entity-mappings>
Add references to the Persistence Unit
New persistence classes and metadata ORM files should be registered in the core extension’s jpa-persistence.xml
.
For example, to register the ext-order-orm.xml
file, open extensions/core/ext-core/src/main/resources/META-INF/jpa-persistence.xml
and add a reference to the new metadata ORM file within the persistence-unit
node as follows:
<mapping-file>META-INF/ext-order-orm.xml</mapping-file>
To register ExtOrderImpl
, open extensions/core/ext-core/src/main/resources/META-INF/jpa-persistence.xml
and add a reference to the extended domain class within the persistence-unit
node as follows:
<class>com.elasticpath.extensions.domain.order.impl.ExtOrderImpl</class>
BeanRegister
Registering new domain classes with New domain classes must be registered through the core bean factories. You can add new bean definitions in the core extension’s ep-core-plugin.xml
to include entries for the new classes.
For example, to register the extended domain class, open extensions/core/ext-core/src/main/resources/META-INF/conf/ep-core-plugin.xml
, and add the following:
<bean id="order" scope="prototype" class="com.elasticpath.extensions.domain.order.impl.ExtOrderImpl"/>
After you make this change, running mvn clean install
from the command line against the core extension project will compile your classes, perform bytecode enhancement, rebuild the jar, and install it in your repository.
Exclude references from the Persistence Unit
To exclude existing domain classes and/or metadata ORM files, you can add to the exclusion lists persistenceMappingExcludedClasses
and persistenceMappingExcludedFiles
respectively. These can be found in the core extension’s ep-core-plugin.xml
file.
Override Persistence Unit Properties
Occasionally you may wish to override some of the properties defined in the core persistence unit, or add new properties. To do so, add the properties to the persistencePropertyOverrides
map in the core extension’s ep-core-plugin.xml
file. Do not add or change properties in any of the jpa-persistence.xml
files, as the order in which these files are resolved cannot be guaranteed.