record Student( Identity id, String name, List courses) { } record Course( Identity id, String name, List students) { } record Student( Identity id, String name, List courses) { } record Course( Identity id, String name) { } // ある学生が履修している講座の一覧を取得する student.courses() record Student(String name) { } record Course(String name) { } record Enrollment(Student student, Course course) { } record Student( Identity id, String name, List courseIds) { } record Course( Identity id, String name, List studentIds) { } void enroll(Student student, Identity courseId) { } // ある学生が受講している講座一覧を取得する // 必要に応じて実体を取得する List listCourse(Long studentId) { return select().from("courses") .join(table("enrollments")) .on(table("enrollments").field("course_id").eq(table("courses").field("id"))) .where(table("enrollments").field("studentId").eq(studentId)) .fetch() .map(courseMapper::toDomain) } record Course( Identity id, String name, List students) { } record Course( Identity id, String name, List students) { // null or loaded } record Course( Identity id, String name, List students) { public List students() { if (this.students instanceof VirtualList vl) { vl.load(); } return this.students; } ) record Restaurant( Identity id, String name, List tables ) {} record Table( Identity id, int tableNumber, int capacity ){} void save(Restaurant restaurant) { updateRestaurant(restaurant); // save } record User(Identity id, String name) {} record Group(Identity id, String name) {} record Membership(User user, Group group) {} record Group(List users) { void join(User user) { if (users.size() > 10) { throw new OverException(10); } users.add(user); } } Membership join(Group group, User user) { int numOfMembers = groupRepository.countMembers(group.id()); if (numOfMembers > 10) { throw new OverException(10); } return Membership.of(user, group); } record Order(Identity id, Customer customer, Product product, LocalDateTime orderedAt) {} if (!productRepository.exists(req.productId())) { throw new ProductNotFoundException(req.productId); } // ... Optional product = productRepository.findById(req.productId()); product.ifPresent(p -> { Order order = new Order( id, customer, product, orderedAt ); orderRepository.save(order); }); record Order(Identity id, Customer customer, List lines LocalDateTime orderedAt) {} record OrderLine( Product product, int amount ) {} record Order { Identity id, LocalDateTime orderedAt } record Invoice { Identity id, Identity orderId, // 依存する側が参照を持つ LocalDateTime invoicedAt } record Order { Identity id, LocalDateTime orderedAt } record Invoice { Identity id, List orderIds, // 請求が複数の注文に依存 LocalDateTime invoicedAt }