A DDD object defined by continuous identity, the same thing across attribute changes over time.
A domain entity is an object defined by identity and a lifecycle. A customer who changes her name, address, and email over five years is still the same customer; the thread of continuity that survives every attribute change is what makes her an entity.
Eric Evans named the distinction in Domain-Driven Design (2003). His formulation is that many objects "are not fundamentally defined by their attributes, but rather by a thread of continuity and identity." An entity needsNeedUserA user need, pain, desire, or constraintView reference → a way to answer one question after time has passed: is this the same object? A value objectValue ObjectEngineeringA DDD value objectView reference →, by contrast, is defined entirely by its attributes, holds no identity of its own, and two value objects with equal attributes are interchangeable.
Evans' contribution was to tie the choice to the domain model and its language, so that identity becomes a modelling decisionDecisionStrategyA recorded decision with context, rationale, and consequencesView reference → about the business, not a database artefact. The practical test he gave: if you care whether two things are the same one (this order, that order), it is an entity; if you only care that two things are equal (this £20, that £20), it is a value object.
The line has stayed stable, and the live debate has moved to how strictly to apply it. Functional and event-sourced styles push more concepts toward immutable value objects and reconstruct identity from a stream of events, which narrows the set of things modelled as mutable entities. The judgement Evans asked for is the same one teams still make.
A logistics platform models a Shipment as a domain entity with a shipment_id assigned at creation. Over its life the shipment moves through booked, in-transit, customs-held, and delivered; its carrier changes twice, its estimated arrival is revised nine times, and its weight is corrected after a re-scan. None of these attribute changes creates a new shipment. The identity is stable, so a dispute three months later can be settled by replaying that one shipment's history.
The same platform models the delivery Address as a value object. When a customer corrects a typo in a postcode, the system replaces the old value with a new one, because no one needs to ask whether two addresses are the same instance, only whether they are equal.
Robert C. Martin's Clean Architecture reinforces this separation from a different angle. In his layered model, entities occupy the innermost ring and encapsulate enterprise-wide business rules — the policies least likely to change when something external shifts. By that framing, a domain entity is not a row in a table or a DTO moving through the application; it is the stable core that outer layers — use cases, controllers, databases — depend on, not the reverse. The dependencyDependencyTeam & OrganisationA cross-team or system dependencyView reference → rule runs inward, so the entity's identity and behaviour are insulated from persistence details, which is why the same entity can span several tables without the model caring how storage is arranged.
In the Unified Product Graph, Domain EntityEngineeringA DDD domain entity: a core object with a distinct identity and lifecycle inside a bounded context sits in the Engineering & Platform region, whose mental model runs from bounded contextBounded ContextEngineeringA DDD bounded context defining a service boundaryView reference → through service to the leaves that carry domain meaning. It is held by its aggregate via domain_entityAggregatecontainsDomain Entityhierarchy, the hierarchy edge that encodes Evans' consistency boundary. Two semantic and causal edges then connect it outward: aggregate_contains_domain_entityAPI EndpointreferencesDomain Entitysemantic records which endpoints expose or accept it, and api_endpoint_references_domain_entityData FlowtransportsDomain Entitycausal traces it as it moves between services. Together these make a single question answerable across the graph: where does this identity-bearing concept live, who reads it, and where does it travel.data_flow_transports_domain_entity
Type-specific fields on BaseNode
entity_identitystringIdentifier shape (e.g. "UUID", "email")
lifecyclestringLifecycle description
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
3 edge types connected to this entity.
aggregate_contains_domain_entityapi_endpoint_references_domain_entitydata_flow_transports_domain_entity