Hexagonal, Dependency Inversion, estructura en Spring Boot y cuándo NO usar DDD
Order (dominio, POJO puro) y OrderJpaEntity (infraestructura, @Entity). El adapter de persistencia traduce entre ambas. El coste es algo de código de mapping; el beneficio es que el dominio puede evolucionar independientemente del esquema de BD.// com.myapp.orders (un paquete por Bounded Context) ├── domain/ // POJO puros — sin Spring, sin JPA │ ├── model/ │ │ ├── Order.java // Aggregate Root │ │ ├── OrderItem.java // Entity │ │ ├── OrderId.java // Value Object │ │ └── Money.java // Value Object │ ├── event/ │ │ └── OrderPlaced.java // Domain Event │ └── port/ │ ├── OrderRepository.java // Port (interfaz) │ └── PaymentGateway.java // Port (interfaz) │ ├── application/ // Casos de uso — orquestan, no deciden │ └── PlaceOrderUseCase.java // @Service — llama domain + ports │ └── infrastructure/ // Adapters — hablan con el exterior ├── persistence/ │ ├── JpaOrderRepository.java // implements OrderRepository │ └── OrderJpaEntity.java // @Entity — mapeada desde Order ├── payment/ │ └── StripePaymentAdapter.java // implements PaymentGateway └── web/ └── OrderController.java // @RestController — llama UseCases
domain/, hay una violación de DIP. El dominio no debería conocer @Service, @Repository, @Entity ni ninguna anotación de framework.Subscription que protege las invariantes de renovación y cancelación". No digas "tengo una clase Order" — di "tengo un Aggregate Root Order con identidad propia y frontera transaccional".