libreccm/src/site/apt/entities.apt

66 lines
3.3 KiB
Plaintext

---------------------------
How JPA is used in LibreCCM
---------------------------
Jens Pelzetter
---------------------------
2015-08-13
---------------------------
How JPA is used in LibreCCM
The persistence layer of LibreCCM is based on JPA. We using Hibernate as
implementation because we use some features from Hibernate which are not
available for other JPA providers. The most important of these extensions
is {{{http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html/ch15.html}Envers}}
which provides auditing (versioning) for JPA Entities.
If an entity requires services like permissions and categorisation the
entity should extend
{{{./ccm-core/apidocs/index.html?org/libreccm/core/CcmObject.html}CcmObject}}.
Usually we customise the table name to use underscores instead of camel case
in the database. Also we usually customise the names of columns the use
underscores.
<<Important: To ensure compatibility with the supported
databases (H2, PostgresSQL and Oracle for now) use only uppercase letters
for database objects like schemas, tables and columns.>>
For examples look at the various examples in the code.
Each entity may be accompanied by one or two helper classes. There should
be an {{{Repository_classes}repository}} class for every entity.
Some entities will also be accompanied by a
{{{Manager_classes}manager class}}. The repository classes and the manager
classes are the only classes which should interact directly with the
database using an <<<EntityManager>>>. All other classes should only use
the repository and manger classes to interact with the database.
* {Repository classes}
Each entity is accompanied by a so called <Repository> class. The name of
of the repository class is the name of the entity class followed by the
word <Repository>. For instance the repository class for the <<<User>>>
entity is called <<<UserRepository>>>. The repository class provides
methods for retrieving, saving and deleting entities of a specific type
from and to the database. If there are special queries for the entity these
queries should defined as <named query> on the entity class (using the
<<<@NamedQuery>>> annotation. The repository should provide a method for
each <named query> of the entity it is responsible for.
The {{{./ccm-core/apidocs/index.html?org/libreccm/core/AbstractEntityRepository.html}AbstractEntityRepository}}
class provides a base class for a repository implementing common methods.
Refer to the JavaDoc of the class for more details.
If an entity should be audited which means that you want to keep track of
all changes done to the entity the entity class must be annotated with the
<<<@Audited>>> annotation from Envers. For the repository you should extend
the {{{./ccm-core/apidocs/index.html?org/libreccm/auditing/AbstractAuditedEntityRepository.html}AbstractAuditedEntityRepository}}
class which provides additional common method for audited entities. Please
refer to the JavaDoc for more details.
* {Manager classes}
If there are complex operations involving the entity these operations
should encapsulated by a manager class. There are several examples in the
code.