= Domain type system (JPA/SQM)

The JPA type system is an "unmapped" model, meaning that it has no mapping information -
no references to tables, columns, etc.  The base contract for Hibernate's extension to the
JPA model is `org.hibernate.metamodel.model.domain.DomainType`.

Hibernate's Semantic Query Model (SQM) is defined in terms of these JPA type extensions,
through the `org.hibernate.query.sqm.SqmExpressable` contract allowing parts of the application's
domain model to be used as part of an SQM tree.


[plantuml,SqmTypeSystem,png]
.Domain (JPA/SQM) type system
....
@startuml
skinparam handwritten true

interface DomainType
interface SimpleDomainType
interface BasicDomainType
interface AnyMappingDomainType
interface ManagedDomainType
interface EmbeddableDomainType
interface IdentifiableDomainType
interface EntityDomainType
interface MappedSuperclassDomainType

interface SqmExpressable
interface SqmPathSource
interface PersistentAttribute
interface SingularPersistentAttribute
interface PluralPersistentAttribute

DomainType <|-- SimpleDomainType
SimpleDomainType <|-- BasicDomainType
SimpleDomainType <|-- AnyMappingDomainType
SimpleDomainType <|-- ManagedDomainType
ManagedDomainType <|-- EmbeddableDomainType
ManagedDomainType <|-- IdentifiableDomainType
IdentifiableDomainType <|-- MappedSuperclassDomainType
IdentifiableDomainType <|-- EntityDomainType

SqmExpressable <|-- DomainType
SqmExpressable <|-- SqmPathSource

SqmPathSource <|-- EntityDomainType
SqmPathSource <|-- PersistentAttribute

PersistentAttribute <|-- SingularPersistentAttribute
PersistentAttribute <|-- PluralPersistentAttribute

@enduml
....