ID is also a DDD concept known as entity identifier. If the domain entity doesn't have an identifier, your ui and application are not able to manipulate them.
For example, I want to modify the booking contact name of an order with trackingId[123]. the ui need the identifier to fetch the order. The Order domain object is then reconsititute by mapping the order persistent entity(mapping all fields but id). The last thing is store the order(map domain to entity, but id is lost), how can I decide which order persistent entity to be updated if there is no identifier in Order domain object?
So the answer to "I am wondering, truly decoupling the two would mean not presenting the property Id back to the domain?" is no.
But some ids in persistent entities are not identical in domain objects, these ids could be skipped. same order example, if the application is built based on a legacy database, and the booking contact is an individual table from order table like:
create table t_order {
tracking_id varchar2(255) pk,
//other fields
};
create table t_order_booking_contact {
tracking_id varchar2(255) pk,
name varchar2(255),
//other fields
}
But for some reasons, the BookingContact in domain model is a value object(no id needed). In this case, the trackingId in BookingContact persistent model could be skipped, the mapper and persistent component could use trackingId in Order persistent model instead.
For me, the truly decoupling the two would mean develop the domain models as what makes handle domain logic easily and develop the persistent models as what makes persistence easily. The mapper is used to fix the difference between them.